2008-11-15 11 views
8

¿Cuál es el secreto para obtener ClaimsResponse trabajando con DotNetOpenId?¿Cuál es el secreto para obtener ClaimsResponse trabajando con DotNetOpenId?

Por ejemplo, en este fragmento de código (de Scott Hanselman's blog) el objeto ClaimsResponse debe tener un montón de pequeños cosas como 'apodo' y 'e-mail', pero el propio objeto ClaimsResponse es 'nulo':

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

al principio, pensé que era porque no estaba a redirigir al proveedor con un 'ClaimsRequest' ... pero utilizando este código para redirigir al proveedor de OpenID todavía no ayuda:

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é estoy haciendo mal? ¿O han experimentado otros desarrolladores el mismo dolor?

Respuesta

4

Su código se ve bien. Pero tenga en cuenta que la extensión sreg, que está utilizando, no es compatible con todos los OP. Si el OP con el que se está autenticando no lo admite, entonces la extensión de respuesta será nula como lo está viendo. Entonces un cheque nulo siempre es una buena idea.

myopenid.com admite sreg, si está buscando un OP para probar en contra.

2

Con la versión de latests DotNetOpenId, este código parece funcionar bien para mí:

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

en la declaración del proveedor:

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

PS: Estoy usando MVC, no WebForms.

+0

Tengo curiosidad, ¿qué proveedor de OpenId estás usando? –

+0

igual que tu compañero, DotNetOpenId. –

+0

No, no, me refiero a cuando se conecta para validar su OpenId; ¿Estás usando Yahoo, AOL, Wordpress, MyOpenId, etc.? –

6

No sé si ha resuelto el problema o no, pero encontré la solución después de muchas horas de lucha. En realidad, necesita cambiar su archivo web.config para reclamar el correo electrónico y el nombre completo aquí está web.config que funciona para mí. Lo descargué del proyecto nerddinner. En realidad copié todo excepto web.config y no recibía el campo de correo electrónico. Entonces más tarde descubrí que algo más está mal. Copié web.config del proyecto nerddinner y todo estaba funcionando.

aquí está el archivo, si no quieres ir al proyecto 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 - gracias por la información. Parece que la línea mágica podría ser la línea DotNetOpenAuth.OpenId.Behaviors.AXFetchAsSregTransform ... ver http://www.dotnetopenauth.net/developers/code-snippets/the-axfetchassregtransform-behavior/ –

2

que utilizan

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

en lugar de

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

Y en la respuesta tratan

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

simplemente lugar de acceder a las reivindicaciones. Esto funcionó conmigo en ASP.Net para google.

El problema en ASP.Net es que la solicitud no se envía completa cuando se utiliza ClaimsRequest, puede ver que si usó Fiddler. y la respuesta tampoco se recupera correctamente para que necesite acceder a los parámetros directos desde los parametros de Solicitud. Todos están allí.

0

Pude recibir los parámetros correctamente después de la siguiente actualización en web.config que copié de una muestra.

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

bajo <configsections>

y añadir estos solos

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

Ninguna de las anteriores trabajado para mí (a través de PayPal Access como un identificador) en C#

La continuación trabajó para mí :

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

} 
Cuestiones relacionadas