此问题是How to pass required claims to OpenID identity provider with Azure ACS?
的延续虽然对问题略有不同,因此我将此作为一个新问题发布。注意:我也将其交叉发布到the Azure Security forum,但到目前为止还没有得到任何有用的输入。
Azure ACS samples表明可以向ACS添加任意OpenID身份提供程序。但是对于ACS来说,作为各种流行提供商的STS实际上有助于我们的项目,我们开始让ACS与MyOpenID.com一起工作(同样,也在样本中使用)。与the good Vittorio shows一样,问题是除非要求,否则MyOpenID不会向我们提供名称和电子邮件地址等声明。 Vittorio和其他人说这是因为MyOpenID不支持Attribute Exchange。
但是,我对此不太确定。深入研究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端点的参数列表:
不幸的是,当响应返回给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成功验证我的网站身份提供者。虽然MyOpenID不会移交,但问题仍然存在。如果来自ACS的请求未明确要求声明类型http://schema.openid.net/namePerson
或http://schema.openid.net/contact/email
答案 0 :(得分:0)
出于安全原因,ACS不允许呼叫者重新键入电子邮件地址声明。实际上,您在不知情的情况下尝试的是来自this paper的攻击4.5(OpenID数据类型混淆)的变体。出于安全原因,ACS必须确保电子邮件地址和其支持的其他AX声明与其所知的类型完全匹配,否则恶意呼叫者可能会欺骗ACS并将一个声明替换为另一个声明。这不是ACS不支持AX,而是ACS仅支持单一声明类型作为电子邮件声明,并且它与MyOpenID使用的不同。简而言之,这是行不通的。