Почему через протокол не проходит информация о пользователе openID?

Я использую DotNetOpenAuth для интеграции openID в наше веб-приложение. Код ниже запрашивает информацию у провайдера.

try
{
  var req = openid.CreateRequest(Request.Form["openid_identifier"]);
  req.AddExtension(new DotNetOpenAuth.OpenId.Extensions.SimpleRegistration.ClaimsRequest
  {
    Email = DotNetOpenAuth.OpenId.Extensions.SimpleRegistration.DemandLevel.Require,
    FullName = DotNetOpenAuth.OpenId.Extensions.SimpleRegistration.DemandLevel.Require,
    Nickname = DotNetOpenAuth.OpenId.Extensions.SimpleRegistration.DemandLevel.Request,
    PostalCode = DotNetOpenAuth.OpenId.Extensions.SimpleRegistration.DemandLevel.Request
  });

  return req.RedirectingResponse.AsActionResult();
}

По какой-то причине ответ от провайдера openID никогда не приходит с информацией, которую я запрашиваю. Ниже приведен код:

// Stage 3: OpenID Provider sending assertion response
switch (response.Status) {
  case AuthenticationStatus.Authenticated:
    Session["FriendlyIdentifier"] = response.FriendlyIdentifierForDisplay;
    FormsAuthentication.SetAuthCookie(response.ClaimedIdentifier, false);
    if (!string.IsNullOrEmpty(returnUrl)) {
       return Redirect(returnUrl);
    } else {
       return RedirectToAction("Index", "Home");
    }

Я пробовал: response.ClaimedIdentifier миллионом способов, и у него никогда не было ценной информации, с которой я мог бы что-то сделать. Любые идеи?


person Geo    schedule 08.09.2009    source источник


Ответы (1)


Свойство IAuthenticationResponse.ClaimedIdentifier никогда не содержит запрашиваемых вами атрибутов. Он содержит только «имя пользователя» пользователя OpenID.

Вы отлично отправляете запрос. Просто добавьте немного к вашей обработке положительного ответа:

// Stage 3: OpenID Provider sending assertion response
switch (response.Status) { 
  case AuthenticationStatus.Authenticated:
    Session["FriendlyIdentifier"] = response.FriendlyIdentifierForDisplay; 
    FormsAuthentication.SetAuthCookie(response.ClaimedIdentifier, false);
    var sreg = response.GetExtension<ClaimsResponse>();
    if (sreg != null) { // the Provider MAY not provide anything
      // and even if it does, any of these attributes MAY be missing
      var email = sreg.Email;
      var fullName = sreg.FullName;
      // get the rest of the attributes, and store them off somewhere.
    }
    if (!string.IsNullOrEmpty(returnUrl)) {
      return Redirect(returnUrl);
    } else {
       return RedirectToAction("Index", "Home");
    }
  break;
  // ...
person Andrew Arnott    schedule 08.09.2009
comment
Привет Андрей: Большое спасибо, это работает. Google возвращает письмо, Yahoo — нет. Я ценю вашу помощь. - person Geo; 08.09.2009
comment
Yahoo должен быть сейчас ... они только что обновили его, чтобы поддерживать его. - person Andrew Arnott; 15.01.2010