Защо информацията за потребителя на 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 never съдържа тези атрибути, които заявявате. Той съдържа само "потребителското име" на потребителя на 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