Как извлечь данные из атрибута 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. Извини за это.

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