Как извлечь данные из атрибута DotNetOpenID AX?
Эндрю Арнотт (Andrew Arnott) имеет здесь пост о том, как извлечь данные расширения обмена атрибутами из проивдера OpenId. Вот фрагмент кода:
var fetch = openid.Response.GetExtension<FetchResponse>();
if (fetch != null)
{
IList<string> emailAddresses = fetch.GetAttribute
(WellKnownAttributes.Contact.Email).Values;
IList<string> fullNames = fetch.GetAttribute
(WellKnownAttributes.Name.FullName).Values;
string email = emailAddresses.Count > 0 ? emailAddresses[0] : null;
string fullName = fullNames.Count > 0 ? fullNames[0] : null;
}
Когда я пытаюсь сделать следующее...
fetch.GetAttribute(...)
Я получаю ошибку компиляции. По сути, этого не существует. Это единственный (читай: правильный) способ сделать это следующим образом...
fetch.Attribue[WellKnownAttributes.Contact.Email].Values
ура:)
1 ответ
Боюсь, что мой пост был написан для DotNetOpenId 2.x, но DotNetOpenAuth 3.x имеет немного другой API для расширения AX, и это то, с чем вы столкнулись.
То, что вы пришли, близко, но не совсем то, что вы должны иметь. Что у вас будет генерировать NullReferenceException
или же KeyNotFoundException
если атрибут не включен в ответ от провайдера. На самом деле, это может быть и ошибкой в моем блоге, если только DNOI 2.x не был реализован иначе, я не помню.
В любом случае, вот что вы должны сделать, чтобы найти адрес электронной почты:
if (fetch.Attributes.Contains(WellKnownAttributes.Contact.Email)) {
IList<string> emailAddresses =
fetch.Attributes[WellKnownAttributes.Contact.Email].Values;
string email = emailAddresses.Count > 0 ? emailAddresses[0] : null;
// do something with email
}
Если это кажется трудоемким, просто извлекая адрес электронной почты, объясните это сложностью и гибкостью самого расширения AX. Извини за это.