2008-11-15 9 views
8

Bí quyết để nhận được ClaimsResponse hoạt động với DotNetOpenId là gì?Bí quyết để nhận được ClaimsResponse hoạt động với DotNetOpenId là gì?

Ví dụ, trong chút mã này (từ Scott Hanselman's blog) đối tượng ClaimsResponse nên có rất nhiều điều nhỏ đẹp như 'nickname' và 'địa chỉ email', nhưng đối tượng ClaimsResponse chính nó là '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; 
    } 
} 

Lúc đầu, tôi nghĩ đó là bởi vì tôi đã không chuyển hướng đến các nhà cung cấp với một 'ClaimsRequest' ... nhưng sử dụng mã này để chuyển hướng đến các nhà cung cấp OpenID vẫn không giúp:

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

Tôi đang làm gì sai? Hoặc có những người phát triển khác trải qua cùng một nỗi đau?

Trả lời

4

Mã của bạn có vẻ ổn. Nhưng lưu ý rằng phần mở rộng sreg, mà bạn đang sử dụng, không được hỗ trợ bởi tất cả các OP. Nếu OP bạn đang xác thực không hỗ trợ, thì tiện ích mở rộng phản hồi sẽ là rỗng khi bạn thấy. Vì vậy, một kiểm tra null luôn luôn là một ý tưởng tốt.

myopenid.com hỗ trợ sreg, nếu bạn đang tìm kiếm OP để kiểm tra.

2

Với phiên bản latests của DotNetOpenId, mã này dường như làm việc tốt cho tôi:

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

khi trở về từ nhà cung cấp:

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

PS: Tôi đang sử dụng MVC, không WebForms.

+0

Tôi thực sự tò mò - bạn đang sử dụng nhà cung cấp OpenId nào? –

+0

giống như bạn giao phối, DotNetOpenId. –

+0

Không không - ý tôi là khi bạn kết nối để xác nhận OpenId của mình; bạn đang sử dụng Yahoo, AOL, Wordpress, MyOpenId, v.v ...? –

6

Tôi không biết liệu bạn có giải quyết được vấn đề hay không, nhưng tôi đã tìm ra giải pháp sau nhiều giờ đấu tranh. Trên thực tế, bạn cần thay đổi tệp web.config của mình để xác nhận quyền sở hữu email và tên đầy đủ đây là web.config hoạt động cho tôi. Tôi đã tải xuống từ dự án nerddinner. Trên thực tế tôi đã sao chép mọi thứ ngoại trừ web.config và tôi không nhận được trường email. Vì vậy, sau này tôi tìm thấy cái gì khác là sai. Tôi đã sao chép web.config từ dự án nerddinner và mọi thứ đã hoạt động.

đây là tệp, nếu bạn không muốn chuyển đến dự án 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 - cảm ơn thông tin. Có vẻ như dòng ma thuật có thể là dòng DotNetOpenAuth.OpenId.Behaviors.AXFetchAsSregTransform ... xem http://www.dotnetopenauth.net/developers/code-snippets/the-axfetchassregtransform-behavior/ –

2

tôi đã sử dụng

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

thay vì

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

Và trong phản ứng thử

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

chỉ đơn giản là thay vì truy cập các khiếu nại. Điều này làm việc với tôi trong ASP.Net cho google.

Vấn đề trong ASP.Net là yêu cầu không được gửi hoàn chỉnh khi sử dụng ClaimsRequest bạn có thể thấy rằng nếu bạn sử dụng Fiddler. và đáp ứng cũng không được lấy ra một cách chính xác để bạn cần truy cập các paramat trực tiếp từ Request.params, tất cả chúng đều ở đó.

0

Tôi có thể nhận thông số chính xác sau khi cập nhật sau trong web.config mà tôi đã sao chép từ mẫu.

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

dưới <configsections>

và thêm những một mình

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

Không ai trong số các hoạt động nêu trên đối với tôi (sử dụng PayPal Access như một định danh) trong C#

dưới đây làm việc cho tôi :

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

}