.net-core - Azure AD OAuth 未经许可为受众生成令牌
问题描述
尽管阅读了 Microsoft.com 上的多篇文章和教程,但我在理解如何使用 Azure AD 中的应用注册/OAuth2 定义 API 之间的权限时遇到了问题。例如,我在 Azure AD 中设置了 2 个简单的应用程序注册,一个用于后端 API(比如说客户端 ID A),另一个用于前端或另一个 API(客户端 ID B)。然后,我设置了一个带有默认(模板)身份验证(选项 = 租户、客户端 ID 等)和默认天气预报端点的基本 .NET Core API。
services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
.AddAzureADBearer(options => Configuration.Bind("AzureAd", options));
services.AddControllers();
现在,我可以从 Client ID = B 和 resource = Client ID A 获取令牌https://login.microsoftonline.com/<tenant>/oauth2/token
,并且当我将此令牌(带有 'aud = A')发送到 API 时,它会接受它。
为什么我没有在App Registrations A & B之间建立任何关系,却成功生成了token?Azure AD 中的 API 权限选项卡在两个注册中都是空的 - 我认为 AAD 会拒绝说明应用 B 无权访问应用 A 的请求。或者我是否完全负责通过我的应用上的代码验证受众声明?
解决方案
在 Azure AD 中,可以通过客户端凭据流向客户端应用程序没有权限的应用程序获取访问令牌。这可能是为了启用目标 API 处理整个授权的某些场景,但我不确定。
我前段时间写了一篇关于需要始终检查权限的文章:https ://joonasw.net/view/always-check-token-permissions-in-aad-protected-api 。在微软解决了跨租户获取访问令牌的能力之后,我还写了一篇后续文章:https ://joonasw.net/view/cross-tenant-token-attacks-now-harder-in-azure-ad 。
因为客户端可以在没有权限分配的情况下获得有效的访问令牌,所以授权在您的 API 端至关重要。在我们公司,我们有一个默认授权策略,用于检查每个请求是否包含有效的委派权限/范围或有效的应用程序权限/应用程序角色。这为我们提供了一个基线,该基线已经保护 API 免受此类令牌的影响。它通常不是唯一应用的授权。如果支持委派权限,您需要检查用户是否也有权访问他们尝试执行的操作。毕竟,委派/应用程序权限只说明客户端应用程序可以做什么。
推荐阅读
- azure-blob-storage - 将 csv 数据直接写入 azure blob 存储
- c++ - 如何访问模板包参数的模板参数
- r - Roxygen 无法打开文件/权限被拒绝/执行停止
- laravel - 如果我有与任何请求匹配的“任何”路线,如何排除“/ nova”路线
- reactjs - React - 动态滑块
- arrays - 使用描述符对 NSArray 进行排序
- javascript - Node.js:如何使用 async.js 和 websocket 处理回调?
- ruby-on-rails - 如何在资产后修复 404 未找到来自 gem 的资产:预编译
- sql - SQL 根据另一列对一列求和
- python - 根据同一列中的其他值将列中的值替换为 NaN