Lar*_*ann 4 mediawiki azure-active-directory openid-connect
我在Azure网站上使用PluggableAuth和OpenID Connect扩展设置了MediaWiki服务器.后者使用PHP OpenID Connect Basic Client库.我是Azure AD域中的管理员example.com,其中我创建了一个应用程序,其中包含App ID URI,登录URL和回复URL https://wiki.azurewebsites.net/.当我导航到wiki时,我会观察到以下行为(暂时省略cookie值):
客户请求
GET https://wiki.azurewebsites.net/ HTTP/1.1
RP请求
GET https://login.windows.net/example.com/.well-known/openid-configuration
IP响应
(一些回应)
RP响应
HTTP/1.1 302 Moved Temporarily
Location: https://login.windows.net/{tenant_id}/oauth2/authorize?response_type=code&redirect_uri=https%3A%2F%2Fwiki.azurewebsites.net%2F&client_id={client_id}&nonce={nonce}&state={state}
客户请求
(跟随重定向)
IP响应
HTTP/1.1 302 Found
Location: https://wiki.azurewebsites.net/?code={code}&state={state}&session_state={session_state}
客户请求
(跟随重定向)
RP请求(也重复#2和#3)
POST https://login.windows.net/{tenant_id}/oauth2/token
grant_type=authorization_code&code={code}&redirect_uri=https%3A%2F%2Fwiki.azurewebsites.net%2F&client_id={client_id}&client_secret={client_secret}
IP响应
(由MediaWiki解释;我目前没有记录完整的响应)
AADSTS50001: Resource identifier is not provided.
请注意,如果我在步骤8中更改OpenID PHP客户端以提供"resource"参数,则会从AAD获得以下错误响应:
RP请求
POST https://login.windows.net/{tenant_id}/oauth2/token
grant_type=authorization_code&code={code}&redirect_uri=https%3A%2F%2Fwiki.azurewebsites.net%2F&resource=https%3A%2F%2Fwiki.azurewebsites.net%2F&client_id={client_id}&client_secret={client_secret}
IP响应
AADSTS90027: The client '{client_id}' and resource 'https://wiki.azurewebsites.net/' identify the same application.
我根据@jricher的建议取得了一些进展,但在经历了几次错误之后,我找到了一个我无法弄清楚的错误.完成所有操作后,我将向受影响的库提交拉取请求.
这就是我所做的:
我已将第二个应用程序添加到example.comAzure AD域,并将App ID URI设置mediawiki://wiki.azurewebsites.net/为虚拟"资源".我还授予了https://wiki.azurewebsites.net/应用程序委托访问这个新应用程序的权限.
传递虚拟应用程序的URI作为步骤#8中的resource参数,我现在回到#9中的访问,刷新和ID令牌!
OpenID Connect库要求对ID令牌进行签名,但是当Azure AD签署访问令牌时,它不会签署ID令牌.它具有以下属性:{"typ":"JWT","alg":"none"}.所以我不得不修改库以允许调用者指定无符号ID令牌被认为是"已验证".哎呀.
好的,接下来发现无法验证声明,因为我指定的OpenID提供程序URL和令牌中返回的颁发者URL不同.(说真的?!)因此,必须将提供者指定为https://sts.windows.net/{tenant_id}/,然后才能工作.
接下来,我发现我还没有为OpenID Connect扩展运行MediaWiki DB升级脚本.谢天谢地,这是一个快速修复.
在那之后,我现在离开(我希望是)尝试从AAD的OpenID Connect UserInfo端点获取用户信息的最终问题.我会给它自己的部分.
这就是我现在被困住的地方.在步骤#9之后,在一个或两个中间请求获取元数据和用于验证令牌的密钥后,会发生以下情况:
RP请求:
(更新为使用带有Authorization: Bearer标头的GET ,每个MSDN和规范.)
GET https://login.windows.net/{tenant_id}/openid/userinfo
Authorization: Bearer {access_token}
IP响应:
400 Bad Request
AADSTS50063: Credential parsing failed. AADSTS90010: JWT tokens cannot be used with the UserInfo endpoint.
(如果我将#10更改为POST请求,access_token在主体中,或者access_token在查询字符串中使用GET请求,AAD将返回错误:AADSTS70000: Authentication failed. UserInfo token is not valid.如果我使用id_token代替access_token值的值,则会发生同样的情况收到.)
救命?
我仍然希望有人可以解释最后的问题(UserInfo端点不接受持有者令牌),但我可能将其分解为一个单独的问题.与此同时,我正在向库中添加一些变通方法(PR即将推出),以便可以使用已在承载令牌中返回的声明,而不是调用UserInfo端点.非常感谢所有帮助过这一点的人.
我还有一个令人讨厌的部分,想知道OpenID Connect Basic Profile是不是更简单.我认为这是因为MediaWiki扩展没有实现的原因.
我刚刚看到Vittorio Bertocci的一篇新帖子,其中包含了这个有用的提示:
...在此请求中,应用程序正在为自己请求令牌!在Azure AD中,只有在请求的令牌是id_token时才可以这样做...
这表明,从仅仅改变令牌请求类型在步骤8中authorization_code,以id_token可移除的需要非标准resource参数,并且还使难看第二AAD应用不必要的.仍然是一个黑客,但它感觉不到一个.
贾斯汀是对的.对于授权代码授予流,您必须在授权请求或令牌请求中指定资源参数.
使用&resource = https%3A%2F%2Fgraph.windows.net%2F获取Azure AD Graph API的访问令牌.
使用&resource = https%3A%2F%2Fmanagement.core.windows.net%2F获取Azure服务管理API的令牌.
...
希望这可以帮助
| 归档时间: |
|
| 查看次数: |
1671 次 |
| 最近记录: |