【问题标题】:claimsResponse Return Null索赔响应返回空
【发布时间】:2009-08-25 07:11:09
【问题描述】:

你好,我在 asp.net 中有以下代码。我已将 DotNetOpenAuth.dll 用于 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;
}

对于上面的代码,我总是得到

var claimsResponse = response.GetExtension<ClaimsResponse>();

我总是收到claimsResponse == null。它发生的原因是什么。 openid 是否有任何要求,例如 RelyingParty 的域验证?请尽快给我答复。

【问题讨论】:

    标签: c# openid dotnetopenauth


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        <?xml version="1.0" encoding="utf-8"?>
        <!-- 
            Note: As an alternative to hand editing this file you can use the 
            web admin tool to configure settings for your application. Use
            the Website->Asp.Net Configuration option in Visual Studio.
            A full list of settings and comments can be found in 
            machine.config.comments usually located in 
            \Windows\Microsoft.Net\Framework\v2.x\Config 
        -->
        <configuration>
          <configSections>
            <sectionGroup name="elmah">
             </sectionGroup>
            <section name="dotNetOpenAuth" type="DotNetOpenAuth.Configuration.DotNetOpenAuthSection" requirePermission="false" allowLocation="true" />
          </configSections>
          <connectionStrings configSource="connectionStrings.config">
          </connectionStrings>
          <dotNetOpenAuth>
            <openid>
              <relyingParty>
                <behaviors>
                  <add type="DotNetOpenAuth.OpenId.Behaviors.AXFetchAsSregTransform, DotNetOpenAuth" />
                </behaviors>
              </relyingParty>
            </openid>
          </dotNetOpenAuth>
          <system.web>
            <!-- 
                    Set compilation debug="true" to insert debugging 
                    symbols into the compiled page. Because this 
                    affects performance, set this value to true only 
                    during development.
            -->
            <compilation debug="true" targetFramework="4.0">
              <assemblies>
                <add assembly="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
                <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
                <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
                <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
                <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
              </assemblies>
            </compilation>
            <!--
                    The <authentication> section enables configuration 
                    of the security authentication mode used by 
                    ASP.NET to identify an incoming user. 
            -->
            <authentication mode="Forms">
              <forms loginUrl="~/Account/Logon" />
            </authentication>
            <membership>
              <providers>
                <clear />
                <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" applicationName="/" />
              </providers>
            </membership>
            <profile>
              <providers>
                <clear />
                <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ApplicationServices" applicationName="/" />
              </providers>
            </profile>
            <roleManager enabled="false">
              <providers>
                <clear />
                <add connectionStringName="ApplicationServices" applicationName="/" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
                <add applicationName="/" name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
              </providers>
            </roleManager>
            <customErrors mode="RemoteOnly" defaultRedirect="/Dinners/Trouble">
              <error statusCode="404" redirect="/Dinners/Confused" />
            </customErrors>
        
            <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID">
              <namespaces>
                <add namespace="System.Web.Mvc" />
                <add namespace="System.Web.Mvc.Ajax" />
                <add namespace="System.Web.Mvc.Html" />
                <add namespace="System.Web.Routing" />
                <add namespace="System.Globalization" />
                <add namespace="System.Linq" />
                <add namespace="System.Collections.Generic" />
              </namespaces>
            </pages>
            <httpHandlers>
              <add verb="*" path="*.mvc" validate="false" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
            </httpHandlers>
            <httpModules>
            </httpModules>
            <trace enabled="true" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true" />
          </system.web>
          <!-- 
                The system.webServer section is required for running ASP.NET AJAX under Internet
                Information Services 7.0.  It is not necessary for previous version of IIS.
          -->
          <system.webServer>
            <validation validateIntegratedModeConfiguration="false" />
            <modules runAllManagedModulesForAllRequests="true">
            </modules>
            <handlers>
              <remove name="MvcHttpHandler" />
              <remove name="UrlRoutingHandler" />
              <add name="MvcHttpHandler" preCondition="integratedMode" verb="*" path="*.mvc" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
            </handlers>
          </system.webServer>
          <runtime>
            <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
              <dependentAssembly>
                <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
                <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
              </dependentAssembly>
            </assemblyBinding>
          </runtime>
          <appSettings>
            <add key="microsoft.visualstudio.teamsystems.backupinfo" value="8;web.config.backup" />
            <!-- Fill in your various consumer keys and secrets here to make the sample work. -->
            <!-- You must get these values by signing up with each individual service provider. -->
            <!-- Twitter sign-up: https://twitter.com/oauth_clients -->
            <add key="twitterConsumerKey" value="" />
            <add key="twitterConsumerSecret" value="" />
          </appSettings>
          <system.serviceModel>
            <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
          </system.serviceModel>
        </configuration>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-01-18
          • 2023-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-13
          • 2017-08-13
          相关资源
          最近更新 更多