目前,我正在使用 OpenID(通过 C# 和 DotNetOpenAuth)在 App A(“他们的应用”)和 App B(“我的应用”)之间创建单点登录功能。
我希望利用属性交换来获取他们的应用程序提供的数据。他们的 API 记录了 AX 请求的外观:
openid.ns.ax = http://openid.net/srv/ax/1.0
openid.ax.type.studentids = http://theirapp.com/path/student-ids
请注意 .ax 命名空间。这似乎符合 OpenID 的 AX 规范。
这就是我使用 DotNetOpenAuth 请求和获取属性的方式,正如 SO和大量其他来源所建议的那样:
FetchRequest ax = new FetchRequest();
ax.Attributes.AddRequired("http://theirapp.com/path/student-ids");
request.AddExtension(ax);
和
string sIDs = String.Empty;
if (fetch != null)
sIDs = fetch.GetAttributeValue("http://theirapp.com/path/student-ids");
当回复完全无视 AX 请求时,我感到很困惑。在观察了我们发送的查询字符串参数之后,我认为这实际上不是他们的错:
openid.ns:http://specs.openid.net/auth/2.0
openid.ns.alias3:http://openid.net/srv/ax/1.0
openid.alias3.required:alias1
openid.alias3.mode:fetch_request
openid.alias3.type.alias1:http://theirapp.com/path/student-ids
openid.alias3.count.alias1:1
什么鬼,DotNetOpenAuth?“alias3”是从哪里来的?这应该是“斧头”。我无法判断我正在使用的应用程序是否对 AX 命名空间过于敏感,或者 DotNetOpenAuth 没有关注强制性 OpenID 协议。
所以,在所有这些积累之后,我的问题是:
- 我需要我的 AX 请求位于命名空间 openid.ax 中,而不是 openid.alias3。我如何强制 DotNetOpenAuth 这样做?
- API 要求将请求的属性命名为 - 在本例中为“student-ids”。上面,他们得到了像“alias1”这样的默认名称。如何强制 DotNetOpenAuth 使用自定义名称标记属性?
- 谁在这里:要求 openid.ax 或 DotNetOpenAuth 不关心的 API?