2008-11-15 3 views
8

Was ist das Geheimnis, wenn ClaimsResponse mit DotNetOpenId arbeitet?Was ist das Geheimnis, wenn ClaimsResponse mit DotNetOpenId funktioniert?

Zum Beispiel in diesem Stück Code (von Scott Hanselman's blog) das ClaimsResponse Objekt sollte viele nette kleine Dinge wie ‚Spitznamen‘ und ‚E-Mail-Adresse‘, aber das ClaimsResponse Objekt selbst ist ‚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; 
    } 
} 

zuerst dachte ich, es war, weil ich nicht mit einem ‚ClaimsRequest‘ zum Provider umgeleitet wurde ... aber mit diesem Code an den OpenID-Provider umgeleitet werden immer noch nicht hilft:

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(); 

Was mache ich falsch? Oder haben andere Entwickler den gleichen Schmerz erfahren?

Antwort

4

Ihr Code sieht gut aus. Beachten Sie jedoch, dass die von Ihnen verwendete Sreg-Erweiterung nicht von allen OPs unterstützt wird. Wenn das OP, mit dem Sie sich authentifizieren, dies nicht unterstützt, ist die Antworterweiterung, wie Sie sehen, null. Ein Null-Check ist also immer eine gute Idee.

myopenid.com unterstützt Sreg, wenn Sie ein OP zum Testen suchen.

2

Mit der latests Version von DotNetOpenId, scheint dieser Code gut für mich zu arbeiten:

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

auf Rückkehr von Anbietern:

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

PS: Ich bin MVC verwenden, nicht WebForms.

+0

Ich bin wirklich neugierig - welchen OpenId-Provider benutzen Sie? –

+0

Wie Sie sich paaren, DotNetOpenId. –

+0

Nein nein - ich meine, wenn Sie eine Verbindung herstellen, um Ihre OpenId zu validieren; Benutzt du Yahoo, AOL, Wordpress, MyOpenId, etc? –

6

Ich weiß nicht, ob Sie das Problem gelöst haben oder nicht, aber ich fand die Lösung nach vielen Stunden des Kampfes. Eigentlich müssen Sie Ihre web.config Datei ändern, um E-Mail und Fullname hier ist Web.config, die für mich funktioniert. Ich habe es vom nerddinner-Projekt heruntergeladen. Eigentlich habe ich alles außer web.config kopiert und ich bekam das email Feld nicht. Später fand ich etwas anderes falsch. Ich habe web.config vom nerddinner-Projekt kopiert und alles hat funktioniert.

Hier ist die Datei, wenn Sie nicht zu nerddinner Projekt gehen möchten.

<?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

Ahh - danke für die Info. Die magische Linie könnte die DotNetOpenAuth.OpenId..Behaviors.AXFetchAsSregTransform Linie sein ... siehe http://www.dotnetopenauth.net/developers/code-snippets/the-axfetchassregtransform-behavior/ –

2

benutzte ich

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

statt

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

Und in der Antwort

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

einfach anstelle der Ansprüche zuzugreifen. Das hat bei mir im ASP.Net für google funktioniert.

Das Problem in ASP.Net ist, dass die Anforderung nicht vollständig gesendet wird, wenn Sie ClaimsRequest verwenden, können Sie sehen, wenn Sie Fiddler verwendet haben. und die Antwort wird auch nicht korrekt abgerufen, Sie müssen auf direkte Parameter von Request.params zugreifen, die alle dort sind.

0

Ich konnte Parameter korrekt nach dem folgenden in web.config aktualisiert erhalten, das ich von einer Probe kopierte.

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

unter <configsections>

und fügen Sie diese allein

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

Keine der oben für mich gearbeitet (über PayPal Access als Identifier) ​​in C#

Die unten für mich gearbeitet :

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(); 

}