c# - IAuthenticationResponse.GetExtension<ClaimsResponse>() 总是返回 null

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

更新 感谢@IvanL 的评论,事实证明问题是 Google 特有的。从那以后,我尝试了其他提供商,对于那些提供商,一切都按预期进行。 Google 似乎只是不发送 claim 信息。还没有弄清楚为什么或我需要什么不同才能让谷歌发送它。

暗中的狂野刺杀说它可能与默认为 http://:/的领域有关,因为我看到 Andrew Arnott 的回答,Google 会根据传递的领域更改同一帐户的声明标识符与身份验证请求。

另一个可能很重要的信息:与网上可以找到的许多使用 dotnetopenauth 的示例不同,我没有使用“简单”文本框并自己编写 openIdIdentifier,而是使用 openID selector并且提供传递给 ValidateAtOpenIdProvideropenIdIdentifier。 (根据 Adding OpenID authentication to your ASP.NET MVC 4 application 文章。)

问题是:当使用 Google 作为 openId 提供者时,为什么 IAuthenticationResponse.GetExtension() 总是返回 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(根据 packages.config,根据 Windows Explorer 为 4.0.3.12163)。

我的 web.config 是按照 Activating AXFetchAsSregTransform 中的说明修改的这是 DotNetOpenId - Open Id get some data 的解决方案

不幸的是,这还不足以让它为我工作。

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

    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 方法时始终成功:

   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;
    }

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

我试过谷歌和雅虎。两者的身份验证都很好,都返回 WebDev 服务器记录的身份断言。但是,GetUntrustedExtensionGetExtension 总是 返回 null。我总是从最后一个 else 看到“ikke nick”,而不是我实际用于验证的名字。

我不知道如何继续尝试让它发挥作用。这可能是我的一些疏忽(我是一名经验丰富的开发人员,但刚刚开始涉足 C# 和 Web 前端开发),我看不到它。

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

最佳答案

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

很抱歉回复缓慢,本周在客户处进行了一次大迁移:-)很高兴这条小评论解决了您的问题。

关于c# - IAuthenticationResponse.GetExtension<ClaimsResponse>() 总是返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14024787/

相关文章:

c# - 通用 Windows 程序集是否可以与 .net 控制台应用程序一起使用?

c# - 如何在检查器中使用带有列表的 ReorderableList 并添加新的空项目和折叠子项?

openid - 信息亭PC上的OpenID

c# - DotNetOpenAuth 在修改后编译但在运行示例项目时抛出运行时异常

C# P/Invoke on CUDA DLL 最终导致 AccessViolationException

c# - Bing map 绑定(bind)问题

asp.net-mvc - MVC 日期时间验证失败

c# - MVC - 验证 - ViewModel 是否应该有权访问数据库

asp.net-mvc-4 - 是否有任何理由在 BundleConfig 中有多个 ScriptBundle 包?

oauth - Orchard : Facebook authentication