Я обнаружил, что некоторые провайдеры (например, myopenid.com) возвращали ноль для FetchRequest
, в то время как возвращали действительные данные для ClaimsRequest
.Похоже, разные провайдеры поддерживают разные механизмы обмена атрибутами.В запросе:
var request = openid.CreateRequest(Request.Form["openid_identifier"]);
var sr = new ClaimsRequest
{
Email = DemandLevel.Request,
FullName = DemandLevel.Request
};
request.AddExtension(sr);
var fetchRequest = new FetchRequest();
fetchRequest.Attributes.AddRequired(WellKnownAttributes.Contact.Email);
fetchRequest.Attributes.AddOptional(WellKnownAttributes.Name.FullName);
request.AddExtension(fetchRequest);
return request.RedirectingResponse.AsActionResult();
и при получении ответа:
string email, fullName = String.Empty;
var fetch = response.GetExtension<FetchResponse>();
if (fetch != null)
{
email = fetch.GetAttributeValue(WellKnownAttributes.Contact.Email);
fullName = fetch.GetAttributeValue(WellKnownAttributes.Name.FullName);
}
var claimResponse = response.GetExtension<ClaimsResponse>();
if (claimResponse != null)
{
email = claimResponse.Email;
fullName = claimResponse.FullName;
}
Таким образом, мы пробуем оба пути и надеемся получить данные хотя бы из одного из методов.