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 requiredYes,那么只有具有角色的用户/服务主体可以访问该应用程序,类似的问题here。

【讨论】:

谢谢!我没有意识到 AAD 支持帐户类型设置为仅我的组织。将其更新为需要用户分配后,控制台应用无法按预期获取令牌。

以上是关于Azure 应用服务能够使用托管标识(无应用角色)调用另一个受 AAD 保护的应用服务,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

Azure API 管理 + Azure 函数和托管标识

为啥我的 Azure 应用服务无法使用托管标识连接到 Azure 存储帐户?

使用托管标识进行 AKS 文件共享持久挂载 - 密钥轮换后出现问题

使用托管标识从 Azure Logic 应用向 Azure Function 进行身份验证

使用托管标识在 Azure 中应用服务到应用服务身份验证

将 Azure 托管标识用于部署到 Azure 的应用程序?