跨提供程序检索OpenId用户信息(声明)

时间:2009-09-07 03:31:36

标签: .net openid dotnetopenauth

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

为了澄清我发布此链接作为答案:

http://www.dotnetopenauth.net/developers/code-snippets/the-axfetchassregtransform-behavior/

此链接在一个小配置示例(如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,否则不会返回任何内容。

答案 2 :(得分:0)

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

Cannot get attributes from DotNetOpenId response

添加:这是我在这个主题上写的一篇博客文章。请注意,我在编写AXFetchAsSregTransform行为之前编写了它,因此其中一些比在博客文章中提供的更容易。但特别值得注意的是,它提到Google会忽略所有“可选”的属性请求。因此,您必须将电子邮件设为“必填”才能获得它。

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

相关问题