如何从DotNetOpenID AX属性中提取数据?

时间:2009-05-20 12:58:09

标签: c# .net dotnetopenauth

Andrew Arnott在此有一篇关于如何从OpenId proivder中提取属性交换扩展数据的帖子。这是代码片段: -

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 个答案:

答案 0 :(得分:1)

我担心我的博客文章是针对DotNetOpenId 2.x编写的,但DotNetOpenAuth 3.x的AX扩展的API略有不同,而这正是您所遇到的。

你来的是关闭,但不是你应该拥有的。如果属性未包含在提供者的响应中,您所拥有的内容将生成NullReferenceExceptionKeyNotFoundException。实际上,这也可能是我博客文章中的一个错误,除非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扩展本身的复杂性和灵活性。对不起。