IAuthenticationResponse.GetExtension <claimsresponse>()始终返回null </claimsresponse>

时间:2012-12-24 18:51:14

标签: c# asp.net-mvc-4 dotnetopenauth

更新 感谢@IvanL的评论,结果发现问题是Google特有的。我已经尝试过其他提供商,并且一切都按预期工作。谷歌似乎似乎没有发送索赔信息。还没有能够弄清楚为什么或我需要不同的方式让谷歌发送它。

黑暗中的狂野刺伤表示它可能与默认为http://:/的领域有关,因为我看到安德鲁·阿诺特的答案,谷歌根据传递的领域更改同一帐户的声称标识符使用身份验证请求。

另一个可能很重要的信息:与网络上可以找到的使用dotnetopenauth的许多示例不同,我不是使用“简单”文本框并自己编写openIdIdentifier,但我使用的是{{3}这就是提供传递给openIdIdentifier的{​​{1}}。 (根据openID selector文章。)

问题是:为什么IAuthenticationResponse.GetExtension()在使用Google作为openId提供程序时始终返回null,否则所有与Google相关的问题(根据需要请求电子邮件,AXFetchAsSregTransform等)都已解决?

原始

我正在努力让DotNetOpenAuth解析从提供程序返回的响应。按照Adding OpenID authentication to your ASP.NET MVC 4 application的说明进行登录应该正常工作,返回主页时返回登录结果,并在右上方显示用户名(昵称)。 (这取决于“用户应该在这一点上看到以下内容:”超过文章的一半)。

我正在使用带有C#的Visual Studio Web Developer 2010 Express。 DotNetOpenAuth版本是4.0.3.12153(根据Windows资源管理器中的packages.config,4.0.3.12163)。

我的web.config已根据Adding OpenID authentication to your ASP.NET MVC 4 application中的说明进行了修改,这是Activating AXFetchAsSregTransform的解决方案

不幸的是,让它为我工作是不够的。

openid-selector工作正常,导致正确选择openid提供程序。身份验证请求创建如下:

ValidateAtOpenIdProvider

这一切都有效。我可以登录并授权该页面接收我的信息,然后调用 public IAuthenticationRequest ValidateAtOpenIdProvider(string openIdIdentifier) { IAuthenticationRequest openIdRequest = openId.CreateRequest(Identifier.Parse(openIdIdentifier)); var fields = new ClaimsRequest() { Email = DemandLevel.Require, FullName = DemandLevel.Require, Nickname = DemandLevel.Require }; openIdRequest.AddExtension(fields); return openIdRequest; }

GetUser

public OpenIdUser GetUser() { OpenIdUser user = null; IAuthenticationResponse openIdResponse = openId.GetResponse(); if (openIdResponse.IsSuccessful()) { user = ResponseIntoUser(openIdResponse); } return user; } 是作为扩展方法实现的(参见链接文章):

openIdResponse.IsSuccessful

并且在输入return response != null && response.Status == AuthenticationStatus.Authenticated; 方法时始终成功:

ResponseIntoUser

上面的我的版本与链接文章中的代码不同之处在于我添加了最后的else块以确保我总是获得显示用户名和注销链接的主页(这有助于尝试执行此操作时连续几次。)

我曾尝试过谷歌和雅虎。两者都认证正常,都返回WebDev服务器记录的身份断言。但是, private OpenIdUser ResponseIntoUser(IAuthenticationResponse response) { OpenIdUser user = null; var claimResponseUntrusted = response.GetUntrustedExtension<ClaimsResponse>(); var claimResponse = response.GetExtension<ClaimsResponse>(); // For this to work with the newer/est version of DotNetOpenAuth, make sure web.config // file contains required settings. See link for more details. // http://www.dotnetopenauth.net/developers/help/the-axfetchassregtransform-behavior/ if (claimResponse != null) { user = new OpenIdUser(claimResponse, response.ClaimedIdentifier); } else if (claimResponseUntrusted != null) { user = new OpenIdUser(claimResponseUntrusted, response.ClaimedIdentifier); } else { user = new OpenIdUser("ikke@gmail.com;ikke van ikkenstein;ikke nick;ikkeclaimedid"); } return user; } GetUntrustedExtenstion 始终会返回null。我总是从最后的其他地方看到“ikke nick”,而不是我实际用来认证的名字。

我对如何继续尝试让它发挥作用感到茫然。这可能是我的一些疏忽(我是一个经验丰富的开发人员,但刚刚开始在C#和Web前端开发中浸泡我的脚趾),我看不到它。

非常欢迎任何有关如何进行/调试的建议。

1 个答案:

答案 0 :(得分:0)

您是否使用Google作为OpenId提供商来测试您的解决方案?因为Google只有在您第一次对应用程序进行身份验证时才有/包含声明的习惯。所以也许尝试使用新的谷歌帐户,看看是否有效?

对于反应缓慢感到抱歉,本周在客户端进行大规模迁移:-)很高兴这条小评论解决了你的问题。

相关问题