4

我在登录过程中使用 DotNetOpenAuth 登录。它非常适合处理身份验证,但从各种 openId 提供程序检索用户信息的过程效果不佳。

使用 MyOpenId,我确实获得了使用带有 DotNetOpenAuth 的 ClaimsRequest 请求的完整信息。它显然使用 SREG 协议来请求和检索此内容。这适用于 MyOpenId,但对 Google 或 Yahoo 以及其他不支持此协议的提供商(还没有?)没有任何作用。

有没有办法使用 DotNetOpenAuth(或 RPX 以外的其他机制(不是在中间寻找另一个人:-}))来检索跨提供商用户信息?

4

3 回答 3

2

我建议您查看发生的实际交换。即当您的服务将用户重定向到提供者时,找出发送了哪些参数,然后,当用户回来时,还找出传输了哪些参数。

在 OpenID 2 中,请求用户信息的方式有两种:属性交换 (AX) 和简单注册 (SREG)。不确定 SIG 是什么。提供者是否实现这些协议,以及他们提供什么信息,是他们的选择(首先,然后希望也是用户的选择)。

我发现 Google 支持 AX,并且始终提供电子邮件地址,有时还提供用户的名字和姓氏。根据我的经验,雅虎除了声称的 ID 之外什么都不提供。因此,我不接受雅虎作为提供者,请参阅http://pypi.python.org/pypi?:action=openid

于 2009-09-07T04:43:14.287 回答
1

为澄清起见,我将此链接发布为答案:

http://www.dotnetopenauth.net/developers/code-snippets/the-axfetchassregtransform-b​​ehavior/

此链接在一个小型配置示例(如 Andrew 所述)中提供了 AXFetchAsSregTransform 行为的配置文件设置,该示例允许使用 ClaimsRequest() 获取 SREG 和 AX 信息。

这允许检索一些(但不是全部)请求信息。对于谷歌来说,它至少可以用于电子邮件地址检索。

提出请求:

var req = openid.CreateRequest(Request.Form["openid_identifier"]);

var fields = new ClaimsRequest();                       
fields.Email = DemandLevel.Require;
fields.FullName = DemandLevel.Require;

req.AddExtension(fields);

return req.RedirectingResponse.AsActionResult();

接收响应:

var claim = response.GetExtension<ClaimsResponse>();
string email = null, fullname= null, password = null;
if (claim != null)
{
    email = claim.Email;
    fullname = claim.FullName;
}

请注意,Google 似乎只接收电子邮件地址,并且需要 DemandLevel.Require,否则不会返回任何内容。

于 2009-09-07T22:01:23.630 回答
0

在这里查看我对一个非常相似的问题的回答:

无法从 DotNetOpenId 响应中获取属性

补充:这是我写的关于这个主题的博客文章。请注意,我在编写 AXFetchAsSregTransform 行为之前编写了它,因此其中一些比博客文章中介绍的更容易。但特别值得注意的是,它提到谷歌忽略了所有“可选”的属性请求。因此,您必须将电子邮件设置为“必需”才能获得它。

http://blog.nerdbank.net/2009/03/how-to-pretty-much-guarantee-that-you.html

于 2009-09-07T04:45:44.010 回答