Azure API Management与OAuth2权限疑问:是否需应用角色?
Azure APIM OAuth2 应用角色与API权限详解(服务到服务场景)
1. 到底要不要应用角色和权限?
必须要。你现在删除所有权限后还能调用API,只是因为你的APIM仅做了Token合法性校验(比如验证是否由可信Azure AD签发、是否未过期),没有配置权限校验逻辑。这种状态下,任何能获取到该API有效Bearer Token的应用都可以随意调用,完全没有安全边界,等于没做实际的权限控制。
2. 需要的权限/角色及各自作用
(1)应用角色(定义在APIM对应的资源应用注册中)
- 这是你为APIM API设定的权限标识,比如
Reader、Writer,用来区分不同客户端的访问权限范围。你的场景是简单GET接口,只需要一个Reader角色即可,代表客户端拥有该API的只读访问权限。 - 核心作用:客户端请求到的Token中会携带该角色声明,APIM后续可通过校验这个声明来判断是否允许请求通行。
(2)API权限(客户端应用向资源应用申请的权限)
- 你需要在客户端应用注册中,向APIM对应的资源应用申请上述
Reader角色权限,且必须选择应用权限类型(因为你的场景是服务到服务调用,无真实用户参与),同时点击「授予管理员同意」——只有完成同意,Azure AD才会将该角色声明注入到颁发给客户端的Token中。 - 额外说明:教程中添加的
User.Read.All和User.ReadWrite.All属于Microsoft Graph权限,你的场景和Graph服务无关,完全是多余的,直接删除即可。
(3)为什么无权限也能拿到Token?
Azure AD颁发Token时,只要客户端的ID和密钥合法,哪怕没有申请任何权限,也会生成一个“无权限声明”的Token。但这种Token本该被APIM拦截,只是你没配置权限校验策略才得以通行。
3. 如何配置最小权限?
按以下三步操作,缺一不可:
- 第一步:给APIM的资源应用添加应用角色
- 进入Azure AD → 应用注册,找到你为APIM创建的资源应用
- 选择「应用角色」→「创建应用角色」
- 填写角色名称(如
Reader)、显示名称、描述,勾选「允许应用程序访问」后保存。
- 第二步:给客户端应用添加并同意权限
- 进入客户端应用注册 →「API权限」→「添加权限」
- 选择「我的 APIs」,找到APIM对应的资源应用
- 选择「应用权限」,勾选
Reader角色后点击「添加权限」 - 点击「授予管理员同意」(应用权限必须由管理员手动确认)
- 第三步:APIM配置权限校验策略
这是关键环节,否则前面的配置都无法生效。在你的APIM API的入站策略中添加以下代码,校验Token的roles字段是否包含Reader:
添加后,只有携带<validate-jwt header-name="Authorization" failed-validation-httpcode="403" failed-validation-error-message="权限不足,仅允许Reader角色访问"> <openid-config url="https://login.microsoftonline.com/{你的租户ID}/v2.0/.well-known/openid-configuration" /> <required-claims> <claim name="roles" match="any"> <value>Reader</value> </claim> </required-claims> </validate-jwt>Reader角色声明的Token才能通过校验,无权限的请求会直接返回403。
内容的提问来源于stack exchange,提问作者DenCowboy
相关产品推荐
相关产品推荐

