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

Mar*_*ema 6 c# dotnetopenauth asp.net-mvc-4

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

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

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

问题是:当使用Google作为openId提供者时,为什么IAuthenticationResponse.GetExtension()总是返回null,否则所有关于谷歌的所有相关问题(根据需要请求电子邮件,AXFetchAsSregTransform等)都已得到解决?

原版的

我正在努力让DotNetOpenAuth解析从提供程序返回的响应.遵循向您的ASP.NET MVC 4应用程序添加OpenID身份验证的说明,直至登录应该正常工作,并返回主页的登录结果,并在右上角显示用户名(昵称).(这取决于"用户应该在这一点上看到以下内容:"只是文章的一半).

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

我的web.config按照激活AXFetchAsSregTransform中的说明进行了修改,这是DotNetOpenId的解决方案- Open Id获取一些数据

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

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;
    }
Run Code Online (Sandbox Code Playgroud)

这一切都有效.我可以登录并授权该页面接收我的信息,然后调用以下内容GetUser:

    public OpenIdUser GetUser()
    {
        OpenIdUser user = null;
        IAuthenticationResponse openIdResponse = openId.GetResponse();

        if (openIdResponse.IsSuccessful())
        {
            user = ResponseIntoUser(openIdResponse);
        }

        return user;
    }
Run Code Online (Sandbox Code Playgroud)

openIdResponse.IsSuccessful 实现为扩展方法(参见链接文章):

return response != null && response.Status == AuthenticationStatus.Authenticated;
Run Code Online (Sandbox Code Playgroud)

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;
    }
Run Code Online (Sandbox Code Playgroud)

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

我曾尝试过谷歌和雅虎.两者都认证正常,都返回WebDev服务器记录的身份断言.然而,GetUntrustedExtenstionGetExtension 总是返回null.我总是从最后的其他地方看到"ikke nick",而不是我实际用来验证的名字.

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

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

Iva*_*anL 0

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

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