6

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

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

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

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

原来的

我正在努力让 DotNetOpenAuth 解析从提供程序返回的响应。按照向您的 ASP.NET MVC 4 应用程序添加 OpenID 身份验证的说明操作,直到登录应该工作的点,登录结果返回到主页,用户名(昵称)显示在右上角。(这取决于“用户此时应该看到以下内容:”刚刚超过文章的一半)。

我正在使用带有 C# 的 Visual Studio Web Developer 2010 Express。DotNetOpenAuth 版本为 4.0.3.12153(根据 packages.config,根据 Windows Explorer 为 4.0.3.12163)。

我的 web.config 按照激活 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 块,以确保我始终获得带有用户名和注销链接的主页(这有助于连续多次尝试执行此操作)。

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

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

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

4

1 回答 1

0

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

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

于 2013-09-03T15:20:49.973 回答