claimsResponse返回Null

您好,我在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(); 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; } 

以上代码我总是得到

 var claimsResponse = response.GetExtension(); 

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

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

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

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

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

即使您获得非空结果,您要求的单个字段(即使您将其标记为必需) 也可能为空或空白。

我不知道你是否解决了这个问题,但经过数小时的努力,我找到了解决方案。 实际上你需要更改你的web.config文件来声明电子邮件和全名这里是web.config对我有用。 我从nerddinner项目下载了它。 实际上我复制了除web.config以外的所有内容,但我没有收到电子邮件字段。 所以后来我发现别的东西是错的。 我从nerddinner项目复制了web.config,一切正常。

这是文件,如果你不想去nerddinner项目。