2009-08-25 7 views
6

안녕하세요, asp.net에 다음 코드가 있습니다. openID에 DotNetOpenAuth.dll을 사용했습니다. 난 항상 내가 항상 claimsResponse == null을 얻고있다claimsResponse Return Null

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

을 얻고있다 위의 코드에 대한

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

아래에있는 코드입니다. 그것이 일어나는 이유는 무엇입니까? RelyingParty에 대한 도메인 유효성 검사와 같은 openid에 필요한 요구 사항이 있습니까 ?? 최대한 빨리 답변 해주십시오.

답변

3

모든 일을 제대로하고있는 것처럼 보입니다. 이 시점에서 귀하가 사용하는 공급자에 따라 다릅니다. 어느 쪽을 테스트하고 있습니까? 일부는 단순 등록 (ClaimsRequest)을 전혀 지원하지 않습니다. 다른 사람들은 허용 된 RP에만 지원합니다. 그러면 다른 사람들은 RP가 "localhost"에있을 때 그것을 지원하지 않습니다.

내 충고 : myopenid.com에 대한 테스트. 단순한 등록 확장에 대한 일관된 동작과 지원이 잘되어있는 것 같습니다. 그러나 RP는 ClaimsResponse에 대해 null을받을 준비가되어 있어야합니다. OP가 당신에게 아무 것도 줄 수 없다는 보장이 없기 때문입니다.

null이 아닌 결과를 얻더라도 요청한 개별 필드 (사용자가 필수라고 표시 한 경우에도) 이 null이거나 비어있을 수 있습니다.

5

또한 공급자 웹 사이트에서 OpenID 계정에 정보를 등록하고 로그인 프로세스 중에 정보를 전송할 수 있는지 확인하십시오. DotNetOpenAuth를 사용하여 동일한 문제가 있었지만 myOpenID- 계정에 정보를 입력하지 않은 것으로 나타났습니다. 전자 메일 주소는 항상 전송되는 것으로 생각되지만 OpenID 계정이 전자 메일 주소에 연결되어 있어도 그렇지 않습니다.

그래서 myOpenID에 난 당신이 문제를 해결하거나하지 않은 경우 잘 모릅니다

+0

내 날을 만들었습니다. :) – pkolodziej

0

을 당신이 등록 페르소나 (귀하의 Account-> 등록 페르소나)를 가지고 있는지 확인,하지만 난 많은 시간 후 해결책을 발견 노력. 사실 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>