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
欢呼:)
答案 0 :(得分:1)
我担心我的博客文章是针对DotNetOpenId 2.x编写的,但DotNetOpenAuth 3.x的AX扩展的API略有不同,而这正是您所遇到的。
你来的是关闭,但不是你应该拥有的。如果属性未包含在提供者的响应中,您所拥有的内容将生成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扩展本身的复杂性和灵活性。对不起。