这个问题是如何使用 Azure ACS 向 OpenID 身份提供者传递所需声明的延续?
不过,它对这个问题的看法略有不同,因此我将其作为一个新问题发布。注意:我也将它交叉发布到Azure 安全论坛,但到目前为止还没有得到任何有用的输入。
Azure ACS 示例显示可以将任意 OpenID 身份提供程序添加到 ACS 。但是为了让 ACS 作为 STS 对我们的项目真正有所帮助,我们着手让 ACS 与 MyOpenID.com 合作(同样,也用于示例)。问题,正如Vittorio 所展示的那样,是 MyOpenID 不会向我们提供诸如姓名和电子邮件地址之类的声明,除非被要求。Vittorio 和其他人说这是因为 MyOpenID 不支持属性交换。
不过,我不太确定。深入挖掘 ACS 生成的请求 url,我可以看到参数openid.ns.ax=http://openid.net/srv/ax/1.0
和openid.ax.required=email,fullname,firstname,lastname
. 此外,openid.ax.type.email
被键入到axschema.org/contact/email
类型。这就是 MyOpenID 出现问题的地方。MyOpenID 不理解 axschema.org 类型,因此不会返回电子邮件值。
我所知道的是 MyOpenID 理解schema.openid.net/contact/email
类型。因此,在此基础上,我手动更改了 ACS 请求 URL 以使用 openid.net 架构而不是 axschema。瞧,MyOpenID 做出反应并显示我的电子邮件地址实际上将被返回。
这是我试图传递给 myopenid.com/server 端点的参数列表:
- openid.ns= http://specs.openid.net/auth/2.0
- openid.mode=checkid_setup
- openid.claimed_id= http://specs.openid.net/auth/2.0/identifier_select
- openid.identity= http://specs.openid.net/auth/2.0/identifier_select
- openid.realm= https://myazurenamespace.accesscontrol.windows.net:443/v2/openid
- openid.return_to= https://myazurenamespace.accesscontrol.windows.net:443/v2/openid ...
- openid.ns.ax= http://openid.net/srv/ax/1.0
- openid.ax.mode=fetch_request
- openid.ax.required=电子邮件,全名
- openid.ax.type.email= http://schema.openid.net/contact/email
- openid.ax.type.fullname= http://schema.openid.net/namePerson
不幸的是,当响应返回给 ACS 时,它还不够好,并且 ACS 失败并出现以下错误代码:
HTTP 错误代码:400 消息:ACS30000:处理 OpenID 登录响应时出错。内部消息:ACS90014:缺少必填字段“openid.ax.value.email”。跟踪 ID:f8e09e6f-0765-4370-9f03-f744cce6fa2a 时间戳:2011-08-02 17:12:57Z
我尝试在不更改原始电子邮件类型的情况下添加其他字段,但只会得到相同的错误。我开始怀疑实际上是 ACS 没有完全支持 AX,并且它有些硬编码以仅接受某些类型的声明。
问题是:我的请求参数对你来说是正确的还是我在这里遗漏了一些明显的东西?
注意:我的初始设置正在工作,如果我保持 ACS 请求不变并且在 ACS 中只为身份提供者配置一个直通规则,我可以使用 MyOpenID 身份提供者通过 ACS 成功验证我的网站。如果来自 ACS 的请求没有明确要求声明类型http://schema.openid.net/namePerson
或http://schema.openid.net/contact/email