8

ClaimsResponse をDotNetOpenIdと連携させる秘訣は何ですか?

たとえば、次のコード ( Scott Hanselman のブログから) では、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(); 

私は何を間違っていますか?それとも、他の開発者が同じ痛みを経験したことがありますか?

4

6 に答える 6

6

あなたが問題を解決したかどうかはわかりませんが、何時間も苦労して解決策を見つけました。実際には、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> 
于 2010-12-04T18:01:51.117 に答える
4

あなたのコードは問題ないようです。ただし、使用している sreg 拡張機能がすべての OP でサポートされているわけではないことに注意してください。認証している OP がそれをサポートしていない場合、ご覧のように応答拡張は null になります。したがって、null チェックは常に良い考えです。

テストする OP を探している場合、myopenid.com は sreg をサポートしています。

于 2008-12-17T04:22:03.137 に答える
2

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: WebForms ではなく、MVC を使用しています。

于 2008-11-15T22:54:07.117 に答える
2

使った

   /* 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"];

単にクレームにアクセスする代わりに。これは、GoogleのASP.Netで私と一緒に働きました。

ASP.Net の問題は、Fiddler を使用した場合に、ClaimsRequest を使用したときに要求が完全に送信されないことです。Request.params から直接パラメーターにアクセスする必要があるため、応答も正しく取得されません。それらはすべてそこにあります。

于 2011-03-12T23:36:41.330 に答える
1

上記のどれも、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();

}
于 2011-12-05T19:58:57.673 に答える
0

サンプルからコピーした web.config で次のように更新すると、パラメーターを正しく受け取ることができました。

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

<configsections>

これらを単独で追加します

<dotNetOpenAuth>
    <openid>
        <relyingParty>
            <behaviors>
                <add type="DotNetOpenAuth.OpenId.Behaviors.AXFetchAsSregTransform, DotNetOpenAuth"/>
            </behaviors>
        </relyingParty>
    </openid>
</dotNetOpenAuth>
于 2011-03-17T11:08:43.040 に答える