Azure 应用服务能够使用托管标识(无应用角色)调用另一个受 AAD 保护的应用服务,为啥?
Posted
技术标签:
【中文标题】Azure 应用服务能够使用托管标识(无应用角色)调用另一个受 AAD 保护的应用服务,为啥?【英文标题】:Azure App Service is able to use Managed Identity(no app roles) to call another AAD protected App service, Why?Azure 应用服务能够使用托管标识(无应用角色)调用另一个受 AAD 保护的应用服务,为什么? 【发布时间】:2021-05-29 22:13:45 【问题描述】:结构升级
-
应用服务 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);
然后我将这个控制台应用程序放到应用服务 A 的 Kudu 控制台并运行它。令人惊讶的是,它能够使用托管身份令牌访问应用服务 B。
我很困惑,托管标识不应该有任何访问权限。 返回的 JWT 令牌:
"aud": "SPN B 的客户端 ID", "iss": "发行人", "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", “版本”:“1.0”
有人可以帮我理解这种情况吗?是因为免费层应用服务计划还是其他默认设置?
非常感谢您!
【问题讨论】:
【参考方案1】:这是正常情况。
如果你用this之类的express设置为app service/azure功能配置AAD auth,实际上它会创建一个App Registration whose Supported account types
is My organization only
,这个租户中的所有用户(应用服务B所在的)都可以登录这个app,并且这个租户中的所有服务主体(托管标识本质上是一个服务主体)都可以获取访问令牌来访问应用服务。
如果你想限制这一点,你提到的app role是选项,将应用服务B的服务主体设置User assignment required
为Yes
,那么只有具有角色的用户/服务主体可以访问该应用程序,类似的问题here。
【讨论】:
谢谢!我没有意识到 AAD 支持帐户类型设置为仅我的组织。将其更新为需要用户分配后,控制台应用无法按预期获取令牌。以上是关于Azure 应用服务能够使用托管标识(无应用角色)调用另一个受 AAD 保护的应用服务,为啥?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 Azure 应用服务无法使用托管标识连接到 Azure 存储帐户?
使用托管标识进行 AKS 文件共享持久挂载 - 密钥轮换后出现问题