azure - Azure 应用服务能够使用托管标识(无应用角色)调用另一个受 AAD 保护的应用服务,为什么?
问题描述
结构升级
- 应用服务 A,应用服务计划 A(免费套餐),系统分配身份开启
- 应用服务 B,具有应用服务计划 B(免费层),具有 AAD 身份验证和授权,具有服务原则 B
就是这样,没有更多的设置,没有应用角色,没有令牌受众。
然后我使用 .Net 5 制作了一个非常简单的控制台应用程序。
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var token = azureServiceTokenProvider.GetAccessTokenAsync("SPN B's client Id", "Tenant Id").GetAwaiter().GetResult();
Console.WriteLine(token);
using (var hc = new HttpClient())
{
hc.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
var res = hc.GetAsync("App service A url").GetAwaiter().GetResult();
var body = res.Content.ReadAsStringAsync().GetAwaiter().GetResult();
Console.WriteLine(body);
}
然后我将这个控制台应用程序放到 App 服务 A 的 Kudu 控制台上并运行它。令人惊讶的是,它能够使用托管身份令牌来访问应用服务 B。
我很困惑,托管标识不应该有任何访问权限。返回的 JWT 令牌:
{ "aud": "SPN B 的客户端 id", "iss": "issuer", "iat": 1614463676, "nbf": 1614463676, "exp": 1614550376, "aio": "E2ZgYHAIulMkupMv5ku6dYrERh0LAA==", "appid “:”托管身份客户端 ID,“appidacr”:“2”,“idp”:“发行者”,“oid”:“托管身份对象 ID”,“rh”:“0.ASgA43WCTWxU70i_QFayzgGduttb1iTw-FBIn9cvBo6st-IoAAA。” , "sub": "托管身份对象 id", "tid": "租户 id", "uti": "--aa0ubSrEqW4yeOzeYBAA", "ver": "1.0" }
有人可以帮我理解这种情况。是因为免费套餐应用服务计划还是其他默认设置?
非常感谢您!
解决方案
这是一个正常的情况。
如果您使用这样的 express 设置为应用服务/azure 功能配置 AAD 身份验证,实际上它会创建一个应用注册,其Supported account types
是My organization only
,该租户中的所有用户(应用服务 B 所在)都可以登录该应用,并且所有此租户中的服务主体(托管标识本质上是服务主体)可以获得访问令牌以访问应用服务。
如果你想限制这一点,你提到的应用角色User assignment required
是选项,设置为Yes
应用服务 B 的服务主体,那么只有具有角色的用户/服务主体可以访问应用程序,这里有类似的问题。
推荐阅读
- uwp - UWP 拖放删除字形和标题
- java - 更新 TreeMap 中的单个键
> 更改所有键值 - css - 使用css向下指向五边形形状内的文本
- micronaut - 使用 Micronaut 控制器时为空机身
- reactjs - 如何使用到达路由器和谷歌分析跟踪页面浏览量?
- android - PDFBOX - 签署 AcroForm PDSignatureField
- html - 一种基于 riosJS 中的 1 验证在 DOM 元素上添加多个类的方法
- amazon-cloudformation - AWS CloudFormation - 如何获取硬件 VPN 的 VGW 外部 IP 地址
- angular - 你如何在 ngb-datepicker 中导航?
- getstream-io - Actor 的不同模型类