【问题标题】:What's the secret to getting ClaimsResponse working with DotNetOpenId?使用 DotNet OpenId 获得 Claims Response 的秘诀是什么?
【发布时间】:2008-11-15 20:07:31
【问题描述】:

让 ClaimsResponse 与 DotNetOpenId 合作的秘诀是什么?

例如,在这段代码(来自Scott Hanselman's blog)中,ClaimsResponse 对象应该有很多不错的小东西,例如“昵称”和“电子邮件地址”,但 ClaimsResponse 对象本身是“null”:

 OpenIdRelyingParty openid = new OpenIdRelyingParty();  
 if (openid.Response != null)  
 {  
    // Stage 3: OpenID Provider sending assertion response  
    switch (openid.Response.Status)  
    {  
       case AuthenticationStatus.Authenticated:  
          ClaimsResponse fetch = openid.Response.GetExtension(typeof(ClaimsResponse)) as ClaimsResponse;  
          string nick = fetch.Nickname;  
          string homepage = openid.Response.ClaimedIdentifier;  
          string email = fetch.Email;  
          string comment = Session["pendingComment"] as string;  
          string entryId = Session["pendingEntryId"] as string;  
          if (String.IsNullOrEmpty(comment) == false && String.IsNullOrEmpty(entryId) == false)  
          {  
             AddNewComment(nick, email, homepage, comment, entryId, true);  
          }  
          break;  
    }  
 }  

起初,我认为这是因为我没有通过“ClaimsRequest”重定向到提供者……但使用此代码重定向到 OpenId 提供者仍然没有帮助:

OpenIdRelyingParty openid = new OpenIdRelyingParty();  
IAuthenticationRequest req = openid.CreateRequest(openid_identifier.Text);  
ClaimsRequest fetch = new ClaimsRequest();  
fetch.Email = DemandLevel.Require;  
fetch.Nickname = DemandLevel.Require;  
req.AddExtension(fetch);  
req.RedirectToProvider(); 

我做错了什么?或者其他开发者是否经历过同样的痛苦?

【问题讨论】:

    标签: .net asp.net security openid dotnetopenauth


    【解决方案1】:

    我不知道你是否解决了这个问题,但经过几个小时的努力,我找到了解决方案。实际上,您需要更改 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> 
    

    【讨论】:

    【解决方案2】:

    您的代码看起来不错。但请注意,并非所有 OP 都支持您正在使用的 sreg 扩展。如果您正在验证的 OP 不支持它,那么响应扩展将为您所看到的 null。所以空检查总是一个好主意。

    myopenid.com 支持 sreg,如果您正在寻找要测试的 OP。

    【讨论】:

      【解决方案3】:

      使用最新版本的 DotNetOpenId,这段代码对我来说似乎可以正常工作:

      var request = openid.CreateRequest(openid_identifier);
      var fields = new ClaimsRequest();
      fields.Email = DemandLevel.Require;
      fields.Nickname = DemandLevel.Require;
      request.AddExtension(fields);
      request.RedirectToProvider();
      

      从提供者返回时:

      var claimResponse = openid.Response.GetExtension<ClaimsResponse>();
      

      PS:我使用的是 MVC,而不是 WebForms。

      【讨论】:

      • 我真的很好奇——你使用的是什么 OpenId 提供程序?
      • 和你的朋友一样,DotNetOpenId。
      • 不不——我的意思是当您连接以验证您的 OpenId 时;您在使用 Yahoo、AOL、Wordpress、MyOpenId 等吗?
      • 我能够在我的测试中针对 MyOpenId 和 Verisign 实验室进行验证。它应该适用于任何 openID 提供程序。
      【解决方案4】:

      我用过

         /* worked */var fetch = new FetchRequest();
         fetch.Attributes.AddRequired(WellKnownAttributes.Contact.Email);
         request.AddExtension(fetch);
      

      而不是

         /* didnt work*/
         var fields = new ClaimsRequest();
         fields.Email = DemandLevel.Require;
         fields.FullName = DemandLevel.Require;
         request.AddExtension(fields); 
      

      并在响应中尝试

          this.Request.Params["openid.ext1.value.alias1"];
      

      只需访问声明即可。这在 ASP.Net for google 中与我一起工作。

      ASP.Net 中的问题是使用 ClaimsRequest 时请求未完整发送,如果您使用 Fiddler,您可以看到这一点。并且响应也没有正确检索到您需要从 Request.params 访问它们都在那里的直接参数。

      【讨论】:

        【解决方案5】:

        以上方法在 C# 中都不适合我(使用 PayPal Access 作为标识符)

        以下对我有用:

        OpenIdRelyingParty openid = new OpenIdRelyingParty();
        
        protected void Page_Load(object sender, EventArgs e)
        {
            var response = openid.GetResponse();
        
            if (response != null)
            {
                switch (response.Status)
                {
                    case AuthenticationStatus.Authenticated:
        
                        if (this.Request.Params["openid.ext1.value.alias1"] != null)
                        {
                            Response.Write(this.Request.Params["openid.ext1.value.alias1"]);
                            Response.Write(this.Request.Params["openid.ext1.value.alias2"]);
                        }
                        else {
                            Response.Write("Alias wrong");
                        }
                        break;
                }
            }
        }
         protected void loginButton_Click(object sender, EventArgs e)
        {
        
            var openidRequest = openid.CreateRequest(openIdBox.Text);
            var fetch = new FetchRequest();
        
            fetch.Attributes.AddRequired(WellKnownAttributes.Contact.Email);
            fetch.Attributes.AddRequired(WellKnownAttributes.Name.FullName);
            openidRequest.AddExtension(fetch);
        
            openidRequest.RedirectToProvider();
        
        }
        

        【讨论】:

          【解决方案6】:

          在我从示例复制的 web.config 中更新以下内容后,我可以正确接收参数。

          <section name="dotNetOpenAuth"
                   type="DotNetOpenAuth.Configuration.DotNetOpenAuthSection"
                   requirePermission="false" 
                   allowLocation="true"/>
          

          &lt;configsections&gt;

          单独添加这些

          <dotNetOpenAuth>
              <openid>
                  <relyingParty>
                      <behaviors>
                          <add type="DotNetOpenAuth.OpenId.Behaviors.AXFetchAsSregTransform, DotNetOpenAuth"/>
                      </behaviors>
                  </relyingParty>
              </openid>
          </dotNetOpenAuth>
          

          【讨论】:

            猜你喜欢
            • 2010-10-05
            • 2020-09-22
            • 2011-07-30
            • 1970-01-01
            • 1970-01-01
            • 2010-09-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多