2008-11-15 5 views
8

Quel est le secret pour que ClaimsResponse fonctionne avec DotNetOpenId?Quel est le secret pour que ClaimsResponse fonctionne avec DotNetOpenId?

Par exemple, dans ce morceau de code (de Scott Hanselman's blog) l'objet ClaimsResponse devrait avoir beaucoup de belles petites choses comme « surnom » et « adresse e-mail », mais l'objet ClaimsResponse lui-même est « nul »:

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; 
    } 
} 

au début, je pensais que c'était parce que je n'allez être redirigé vers le fournisseur d'un « ClaimsRequest » ... mais en utilisant ce code pour rediriger vers le fournisseur de OpenId n'aide pas:

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

Qu'est-ce que je fais mal? Ou est-ce que d'autres développeurs ont éprouvé la même douleur?

Répondre

4

Votre code semble correct. Mais sachez que l'extension sreg, que vous utilisez, n'est pas supportée par tous les OP. Si l'OP avec lequel vous vous authentifiez ne le supporte pas, alors l'extension de réponse sera nulle comme vous le voyez. Donc, une vérification nulle est toujours une bonne idée.

myopenid.com supporte sreg, si vous cherchez un OP à tester.

2

Avec la version de DotNetOpenId actus, ce code semble fonctionner très bien pour moi:

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

sur le retour du fournisseur:

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

PS: J'utilise MVC, pas WebForms.

+0

Je suis vraiment curieux - quel fournisseur OpenId utilisez-vous? –

+0

même que vous l'êtes, DotNetOpenId. –

+0

Non non - je veux dire quand vous vous connectez pour valider votre OpenId; utilisez-vous Yahoo, AOL, Wordpress, MyOpenId, etc? –

6

Je ne sais pas si vous avez résolu le problème ou non, mais j'ai trouvé la solution après de nombreuses heures de lutte. En fait, vous devez changer votre fichier web.config pour réclamer l'email et le nom complet ici est web.config qui fonctionne pour moi. Je l'ai téléchargé du projet nerddinner. En fait, j'ai copié tout sauf web.config et je n'obtenais pas le champ email. Donc plus tard j'ai trouvé quelque chose d'autre qui ne va pas. J'ai copié web.config du projet nerddinner et tout fonctionnait.

Voici le fichier, si vous ne voulez pas aller au projet 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

Ahh - merci pour l'info. On dirait que la ligne magique pourrait être la ligne DotNetOpenAuth.OpenId.Behaviors.AXFetchAsSregTransform ... voir http://www.dotnetopenauth.net/developers/code-snippets/the-axfetchassregtransform-behavior/ –

2

J'utilisé

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

au lieu de

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

Et dans la réponse essayer

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

simplement au lieu d'accéder aux demandes. Cela a fonctionné avec moi dans le ASP.Net pour google.

Le problème dans ASP.Net est que la requête n'est pas envoyée complète lors de l'utilisation de ClaimsRequest, vous pouvez voir que si vous avez utilisé Fiddler. et la réponse n'est pas non plus récupérée correctement pour que vous ayez besoin d'accéder directement aux paramètres depuis Request.params, ils sont tous là.

0

Je pouvais recevoir les paramètres correctement après la mise à jour suivante dans web.config que j'ai copié à partir d'un échantillon.

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

sous <configsections>

et ajoutez-les seuls

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

Aucune de ces travaillé pour moi (en utilisant PayPal Access comme identifiant) en C#

Le dessous a fonctionné pour moi :

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

} 
Questions connexes