2009-08-25 7 views
6

Hallo, ich habe einen folgenden Code in asp.net. Ich habe DotNetOpenAuth.dll für openID verwendet. der Code ist unterclaimsResponse Return Null

protected void openidValidator_ServerValidate(object source, ServerValidateEventArgs args) 
{ 
    // This catches common typos that result in an invalid OpenID Identifier. 
    args.IsValid = Identifier.IsValid(args.Value); 
} 

protected void loginButton_Click(object sender, EventArgs e) 
{ 
    if (!this.Page.IsValid) 
    { 
     return; // don't login if custom validation failed. 
    } 
    try 
    { 
     using (OpenIdRelyingParty openid = this.createRelyingParty()) 
     { 
      IAuthenticationRequest request = openid.CreateRequest(this.openIdBox.Text); 

      // This is where you would add any OpenID extensions you wanted 
      // to include in the authentication request. 
      ClaimsRequest objClmRequest = new ClaimsRequest(); 
      objClmRequest.Email = DemandLevel.Request; 
      objClmRequest.Country = DemandLevel.Request; 
      request.AddExtension(objClmRequest); 

      // Send your visitor to their Provider for authentication. 
      request.RedirectToProvider(); 
     } 
    } 
    catch (ProtocolException ex) 
    { 
     this.openidValidator.Text = ex.Message; 
     this.openidValidator.IsValid = false; 
    } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    this.openIdBox.Focus(); 
    if (Request.QueryString["clearAssociations"] == "1") 
    { 
     Application.Remove("DotNetOpenAuth.OpenId.RelyingParty.OpenIdRelyingParty.ApplicationStore"); 

     UriBuilder builder = new UriBuilder(Request.Url); 
     builder.Query = null; 
     Response.Redirect(builder.Uri.AbsoluteUri); 
    } 

    OpenIdRelyingParty openid = this.createRelyingParty(); 
    var response = openid.GetResponse(); 
    if (response != null) 
    { 
     switch (response.Status) 
     { 
      case AuthenticationStatus.Authenticated: 
       // This is where you would look for any OpenID extension responses included 
       // in the authentication assertion. 
       var claimsResponse = response.GetExtension<ClaimsResponse>(); 
       State.ProfileFields = claimsResponse; 
       // Store off the "friendly" username to display -- NOT for username lookup 
       State.FriendlyLoginName = response.FriendlyIdentifierForDisplay; 
       // Use FormsAuthentication to tell ASP.NET that the user is now logged in, 
       // with the OpenID Claimed Identifier as their username. 
       FormsAuthentication.RedirectFromLoginPage(response.ClaimedIdentifier, false); 
       break; 
      case AuthenticationStatus.Canceled: 
       this.loginCanceledLabel.Visible = true; 
       break; 
      case AuthenticationStatus.Failed: 
       this.loginFailedLabel.Visible = true; 
       break; 

      // We don't need to handle SetupRequired because we're not setting 
      // IAuthenticationRequest.Mode to immediate mode. 
      ////case AuthenticationStatus.SetupRequired: 
      //// break; 
     } 
    } 
} 

private OpenIdRelyingParty createRelyingParty() 
{ 
    OpenIdRelyingParty openid = new OpenIdRelyingParty(); 
    int minsha, maxsha, minversion; 
    if (int.TryParse(Request.QueryString["minsha"], out minsha)) 
    { 
     openid.SecuritySettings.MinimumHashBitLength = minsha; 
    } 
    if (int.TryParse(Request.QueryString["maxsha"], out maxsha)) 
    { 
     openid.SecuritySettings.MaximumHashBitLength = maxsha; 
    } 
    if (int.TryParse(Request.QueryString["minversion"], out minversion)) 
    { 
     switch (minversion) 
     { 
      case 1: openid.SecuritySettings.MinimumRequiredOpenIdVersion = ProtocolVersion.V10; break; 
      case 2: openid.SecuritySettings.MinimumRequiredOpenIdVersion = ProtocolVersion.V20; break; 
      default: throw new ArgumentOutOfRangeException("minversion"); 
     } 
    } 
    return openid; 
} 

für über Code, den ich immer

immer bin
var claimsResponse = response.GetExtension<ClaimsResponse>(); 

ich immer bin immer claimsResponse == null. Was ist der Grund, warum es passiert? Gibt es eine Anforderung, die für Openid-ähnliche Domain-Validierung für RelyingParty erforderlich ist? Bitte geben Sie mir so schnell wie möglich eine Antwort.

Antwort

3

Es sieht so aus als ob Sie alles richtig machen. An dieser Stelle kommt es auf den Provider an, den Sie verwenden. An welchem ​​Testtestest du? Einige unterstützen überhaupt keine einfache Registrierung (ClaimsRequest). Andere unterstützen es nur für Whitelist-RPs. Andere unterstützen es nicht, wenn sich dein RP auf "localhost" befindet.

Mein Rat: Testen Sie gegen myopenid.com, da dies scheint, gutes, konsistentes Verhalten und Unterstützung für die einfache Registrierungserweiterung zu haben. Aber Ihr RP muss immer bereit sein, für ClaimsResponse null zu erhalten, da Sie nie garantieren können, dass das OP Ihnen etwas geben wird.

Selbst wenn Sie einen Nicht-Null-Ergebnis zu erhalten, einzelne Felder, die Sie gefragt (auch wenn Sie markiert sie erforderlich) null oder leer sein.

5

Stellen Sie außerdem sicher, dass Sie die Informationen auf Ihrem OpenID-Konto auf der Website des Anbieters registriert und die Informationen während des Anmeldevorgangs gesendet haben. Ich hatte das gleiche Problem mit DotNetOpenAuth, aber es stellte sich heraus, dass ich die Informationen auf meinem myOpenID-Konto nicht eingegeben hatte. Dachte, dass die E-Mail-Adresse immer gesendet wird, aber das ist nicht der Fall, obwohl das OpenID-Konto mit einer E-Mail-Adresse verbunden ist.

Also auf myOpenID stellen Sie sicher, dass Sie eine Registrierung Persona (Ihre Konto-> Anmeldung Personas)

+0

Du hast meinen Tag gemacht :) – pkolodziej

0

Ich weiß nicht, ob Sie das Problem oder nicht gelöst haben, aber ich fand die Lösung nach vielen Stunden Kampf. 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>