claimsResponse返回Null

6 c# openid dotnetopenauth

您好,我在asp.net中有以下代码.我使用DotNetOpenAuth.dll for openID.代码在

protected void openidValidator_ServerValidate(object source, ServerValidateEventArgs args)
{
    // This catches common typos that result in an invalid OpenID Identifier.
    args.IsValid = Identifier.IsValid(args.Value);
}

protected void loginButton_Click(object sender, EventArgs e)
{
    if (!this.Page.IsValid)
    {
        return; // don't login if custom validation failed.
    }
    try
    {
        using (OpenIdRelyingParty openid = this.createRelyingParty())
        {
            IAuthenticationRequest request = openid.CreateRequest(this.openIdBox.Text);

            // This is where you would add any OpenID extensions you wanted
            // to include in the authentication request.
            ClaimsRequest objClmRequest = new ClaimsRequest();
            objClmRequest.Email = DemandLevel.Request;
            objClmRequest.Country = DemandLevel.Request;
            request.AddExtension(objClmRequest);

            // Send your visitor to their Provider for authentication.
            request.RedirectToProvider();
        }
    }
    catch (ProtocolException ex)
    {
        this.openidValidator.Text = ex.Message;
        this.openidValidator.IsValid = false;
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    this.openIdBox.Focus();
    if (Request.QueryString["clearAssociations"] == "1")
    {
        Application.Remove("DotNetOpenAuth.OpenId.RelyingParty.OpenIdRelyingParty.ApplicationStore");

        UriBuilder builder = new UriBuilder(Request.Url);
        builder.Query = null;
        Response.Redirect(builder.Uri.AbsoluteUri);
    }

    OpenIdRelyingParty openid = this.createRelyingParty();
    var response = openid.GetResponse();
    if (response != null)
    {
        switch (response.Status)
        {
            case AuthenticationStatus.Authenticated:
                // This is where you would look for any OpenID extension responses included
                // in the authentication assertion.
                var claimsResponse = response.GetExtension<ClaimsResponse>();
                State.ProfileFields = claimsResponse;
                // Store off the "friendly" username to display -- NOT for username lookup
                State.FriendlyLoginName = response.FriendlyIdentifierForDisplay;
                // Use FormsAuthentication to tell ASP.NET that the user is now logged in,
                // with the OpenID Claimed Identifier as their username.
                FormsAuthentication.RedirectFromLoginPage(response.ClaimedIdentifier, false);
                break;
            case AuthenticationStatus.Canceled:
                this.loginCanceledLabel.Visible = true;
                break;
            case AuthenticationStatus.Failed:
                this.loginFailedLabel.Visible = true;
                break;

            // We don't need to handle SetupRequired because we're not setting
            // IAuthenticationRequest.Mode to immediate mode.
            ////case AuthenticationStatus.SetupRequired:
            ////    break;
        }
    }
}

private OpenIdRelyingParty createRelyingParty()
{
    OpenIdRelyingParty openid = new OpenIdRelyingParty();
    int minsha, maxsha, minversion;
    if (int.TryParse(Request.QueryString["minsha"], out minsha))
    {
        openid.SecuritySettings.MinimumHashBitLength = minsha;
    }
    if (int.TryParse(Request.QueryString["maxsha"], out maxsha))
    {
        openid.SecuritySettings.MaximumHashBitLength = maxsha;
    }
    if (int.TryParse(Request.QueryString["minversion"], out minversion))
    {
        switch (minversion)
        {
            case 1: openid.SecuritySettings.MinimumRequiredOpenIdVersion = ProtocolVersion.V10; break;
            case 2: openid.SecuritySettings.MinimumRequiredOpenIdVersion = ProtocolVersion.V20; break;
            default: throw new ArgumentOutOfRangeException("minversion");
        }
    }
    return openid;
}
Run Code Online (Sandbox Code Playgroud)

以上代码我总是得到

var claimsResponse = response.GetExtension<ClaimsResponse>();
Run Code Online (Sandbox Code Playgroud)

我总是得到claimsResponse == null.它发生的原因是什么?对于RelyingParty的openid like域验证是否有任何要求?请尽快给我答复.

sal*_*e55 5

还要确保您已在提供商网站上的OpenID帐户中注册了信息,并允许在登录过程中发送信息.我使用DotNetOpenAuth遇到了同样的问题,但事实证明我没有在myOpenID帐户上输入信息.认为始终发送电子邮件地址,但即使OpenID帐户已连接到电子邮件地址,情况也不是这样.

因此,在myOpenID上确保您有一个注册角色(您的帐户 - >注册角色)


And*_*ott 3

看起来你做的一切都是正确的。此时,这取决于您使用的提供程序。您正在测试哪一个?有些根本不支持简单注册 (ClaimsRequest)。其他人仅支持白名单 RP。那么当你的 RP 位于“localhost”时,其他人就不支持它。

我的建议:针对 myopenid.com 进行测试,因为它似乎具有良好、一致的行为并支持简单注册扩展。但是您的 RP 必须始终准备好接收 ClaimsResponse 的 null,因为您永远无法保证 OP 会给您任何东西。

即使您得到非空结果,您要求的各个字段(即使您将它们标记为必填)也可能为空或空白。