В чем секрет работы ClaimsResponse с DotNetOpenId?

В чем секрет работы ClaimsResponse с DotNetOpenId?

Например, в этом фрагменте кода (из Блог Скотта Хансельмана) объект ClaimsResponse должен иметь множество приятных мелочей, таких как «псевдоним» и «адрес электронной почты», но сам объект ClaimsResponse имеет значение «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;  
    }  
 }  

Сначала я подумал, что это потому, что я не перенаправляю к провайдеру с помощью 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(); 

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
0
2 219
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

С последней версией DotNet OpenId мне кажется, что этот код работает нормально:

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.

Мне действительно любопытно - какого провайдера OpenId вы используете?

Dan Esparza 17.11.2008 23:10

такой же, как и вы, DotNetOpenId.

OJ. 18.11.2008 23:32

Нет-нет - я имею в виду, когда вы подключаетесь для проверки вашего OpenId; вы используете Yahoo, AOL, Wordpress, MyOpenId и т. д.?

Dan Esparza 19.11.2008 20:01

В моем тестировании я могу проверить это в лабораториях MyOpenId и Verisign. Он должен нормально работать с любым провайдером openID.

OJ. 17.12.2008 03:39
Ответ принят как подходящий

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

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

Не знаю, решили вы проблему или нет, но я нашел решение после многих часов борьбы. На самом деле вам нужно изменить файл 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> 

Ах - спасибо за информацию. Похоже, волшебной линией может быть строка DotNetOpenAuth.OpenId.Behaviors.AXFetchAsSregTransform ... см. dotnetopenauth.net/developers/code-snippets/…

Dan Esparza 07.12.2010 20:53

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

   /* 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, они все там.

Я смог правильно получить параметры после следующего обновления в 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>

Ничего из вышеперечисленного не сработало для меня (с использованием 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();

}

Другие вопросы по теме