所以我一直在寻找使用Microsofts cordova-plugin-ms-adal插件(使用本机库)针对使用Azure AD的自定义API 为Cordova移动应用程序设置OAuth 2.0 .这一切都运作良好,但我对秘密的使用(或更具体地说,它的缺席)有点困惑.
在网上的许多文章中,他们声明当使用授权代码授予和请求令牌时,您包括秘密.并且当您可以安全地存储例如服务器上的秘密时,此授权类型是理想的.
但是,该插件不要求在应用程序中指定秘密(并且正确地如此),但它仍然使用授权代码授权进行身份验证.我也可以手动打电话
https://login.windows.net/common/oauth2/authorize?resource=http://***.onmicrosoft.com/***API&client_id=***&response_type=code&redirect_uri=http://***.onmicrosoft.com/***App
Run Code Online (Sandbox Code Playgroud)
在我的浏览器中,登录,获取代码,然后POST到https://login.windows.net/common/oauth2/token with
grant_type: authorization_code
client_id: ***
code: ***
redirect_uri: http://***.onmicrosoft.com/***App
resource: http://***.onmicrosoft.com/***API
Run Code Online (Sandbox Code Playgroud)
它有效,所以我得到一个有效的JWT,而不必发送秘密.
为什么!?这不太安全吗?(我也注意到OAuth 2.0规范4.1.3没有说明授权类型授权代码需要秘密!?)
在没有秘密/基本身份验证标头的情况下使用授权类型的authorization_code会有什么影响?
对所谓的机密客户端(具有客户端机密的客户端)使用授权代码授权确实比使用公共客户端更安全。
这是因为授权码本身的交换是作为前端通道中的 URL 参数发生的,即通过浏览器,因此相对容易受到跨脚本、点击劫持、网络/DNS 操纵等攻击。这意味着它在某些情况下(粗心的用户、攻击者的网络控制、服务器实现中粗心的重定向 URI 匹配等),专门的攻击者可能会从用户那里窃取授权码。
为了交换访问令牌的授权代码,机密客户端必须在授权代码旁边在 HTTPs 保护的调用中提供客户端机密,而公共客户端没有任何方法来确保它确实是指定的客户。
这意味着攻击者模仿公共客户端相对容易,因为它只需要非秘密信息(他可以从他自己的浏览器中获取client_id和redirect_uri)以及code他可以通过如上所述的攻击获取的授权。
尽管获取机密客户端的授权代码的工作方式相同,但攻击者无法使用它并将其交换为访问令牌,因为为此他需要一个客户端机密,而攻击者通常很难获得该机密。机密通常存储在服务器的后端存储中,并且仅通过安全的 HTTPs 通道进行通信,因此不会泄漏。
grant_type=authorization_code与公共客户端(没有秘密或以任何其他方式进行身份验证的客户端)一起使用(或任何其他流程)的含义是,授予的访问令牌并不代表客户端直接访问资源的授权,代表客户端授权代表用户访问资源。
这就是为什么您会在Azure AD中注意到,注册本地客户端应用程序(公共客户端)时,只能将其配置为具有对资源的委派权限,而不是仅应用程序权限。
| 归档时间: |
|
| 查看次数: |
2634 次 |
| 最近记录: |