IAuthenticationResponse.GetExtension<;索赔响应>;()总是返回null

本文关键字:返回 null 响应 lt GetExtension IAuthenticationResponse gt | 更新日期: 2023-09-27 17:49:22

更新多亏了@IvanL的一条评论,事实证明这个问题是谷歌特有的。从那以后,我尝试了其他供应商,对于这些供应商,一切都如预期。谷歌似乎就是不发送索赔信息。我还没能弄清楚为什么或者我需要什么不同的方式来让谷歌发送它。

暗箭伤人地说,这可能与领域被默认为http://:/有关,正如我看到的Andrew Arnott的回答,谷歌根据身份验证请求传递的领域更改了同一帐户的声明标识符。

另一条可能很重要的信息:与网络上使用dotnetopenauth的许多例子不同,我不是使用"简单"的文本框并自己编写openIdIdentifier,而是使用openID选择器,它提供传递给ValidateAtOpenIdProvideropenIdIdentifier。(根据将OpenID身份验证添加到ASP.NET MVC 4应用程序文章。(

问题是:为什么是IAuthenticationResponse。当使用Google作为openId提供程序时,GetExtension((总是返回null,否则所有与Google相关的gotcha(按要求请求的电子邮件、AXFetchAsSregTransform等(都已解决?

原始

我正在努力让DotNetOpenAuth解析提供者返回的响应。遵循了将OpenID身份验证添加到ASP的说明。NET MVC 4应用程序,直到登录应该工作的时候,登录会返回到右上角显示用户名(昵称(的主页。(这取决于"用户应该在这一点上看到以下内容:"在文章的一半以上(。

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

根据Activating AXFetchAsSregTransform中的说明修改了我的web.config,这是DotNetOpenId的解决方案-Open Id获取一些数据

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

openid选择器工作正常,可以正确选择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;

并且在进入CCD_ 5方法时总是成功的:

   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块,以确保我总是在主页上显示用户名和注销链接(这在连续几次尝试这样做时很有帮助(。

我试过谷歌和雅虎。两者都可以进行身份验证,都返回WebDev服务器记录的身份断言。但是,GetUntrustedExtenstionGetExtension总是返回null。我总是从最后一个名字中看到"ikke nick",而不是我用来验证的名字。

我不知道如何继续努力,让它发挥作用。这可能是我的疏忽(我是一个经验丰富的开发人员,但刚刚开始涉足C#和web前端开发(,我看不出来

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

IAuthenticationResponse.GetExtension<;索赔响应>;()总是返回null

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

很抱歉反应太慢,本周在一个客户端进行了一次大迁移:-(很高兴这条小评论解决了你的问题。