2008-11-15 4 views
8

В чем секрет получения ClaimsResponse, работающего с DotNetOpenId?В чем секрет получения ClaimsResponse, работающего с DotNetOpenId?

К примеру, в этом кусочке кода (от Scott Hanselman's blog) объект ClaimsResponse должен иметь много приятных мелочей, как «ник» и «адрес электронной почты», но сам объект ClaimsResponse является «нулевым»:

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

Сначала я думал, что это было, потому что я не был перенаправлять к провайдеру с «ClaimsRequest» ... но используя этот код для перенаправления провайдера OpenId все равно не поможет:

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

Что я делаю не так? Или другие разработчики испытывали такую ​​же боль?

ответ

4

Ваш код выглядит хорошо. Но имейте в виду, что расширение sreg, которое вы используете, не поддерживается всеми OP. Если OP, который вы аутентифицируете, не поддерживает его, то расширение ответа будет иметь нулевое значение, как вы видите. Так что нулевая проверка - это всегда хорошая идея.

myopenid.com поддерживает sreg, если вы ищете OP для тестирования.

2

С latests версии DotNetOpenId, этот код, кажется, работает хорошо для меня:

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

по возвращении из поставщика:

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

PS: Я использую MVC, не WebForms.

+0

Мне действительно интересно - какой провайдер OpenId вы используете? – 2008-11-17 20:10:23

+0

такой же, как и вы, DotNetOpenId. – 2008-11-18 20:32:04

6

Я не знаю, решила ли вы проблему или нет, но я нашел решение после многих часов борьбы. На самом деле вам нужно изменить свой файл web.config на запрос электронной почты и полное имя , здесь web.config работает для меня. Я загрузил его из проекта nerddinner. На самом деле я скопировал все, кроме web.config, и я не получал поле электронной почты. Поэтому позже я обнаружил, что что-то еще не так. Я скопировал web.config из проекта nerddinner и все работало.

вот файл, если вы не хотите идти в проект 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

Я использовал

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

вместо

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

И в ответ пытаются

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

просто вместо доступа к претензии. Это работало со мной в ASP.Net для Google.

Проблема в ASP.Net заключается в том, что запрос не отправляется полностью при использовании ClaimsRequest, вы можете видеть, что если вы использовали Fiddler. и ответ также не получается правильно, вам нужно получить доступ к прямым параметрам из Request.params, они все там.

0

Я мог бы получить параметры правильно после следующего обновления в web.config, который я скопировал из образца.

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

под <configsections>

и добавить эти в покое

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

Ни один из вышеперечисленных работал для меня (с использованием PayPal Access в качестве идентификатора) в C#

В приведенной ниже работал для меня :

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

} 

 Смежные вопросы

  • Нет связанных вопросов^_^