首页 > 解决方案 > Azure 应用服务能够使用托管标识(无应用角色)调用另一个受 AAD 保护的应用服务,为什么?

问题描述

结构升级

  1. 应用服务 A,应用服务计划 A(免费套餐),系统分配身份开启
  2. 应用服务 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" }

有人可以帮我理解这种情况。是因为免费套餐应用服务计划还是其他默认设置?

非常感谢您!

标签: azureazure-active-directoryazure-web-app-service

解决方案


这是一个正常的情况。

如果您使用这样的 express 设置为应用服务/azure 功能配置 AAD 身份验证,实际上它会创建一个应用注册,其Supported account typesMy organization only,该租户中的所有用户(应用服务 B 所在)都可以登录该应用,并且所有此租户中的服务主体(托管标识本质上是服务主体)可以获得访问令牌以访问应用服务。

如果你想限制这一点,你提到的应用角色User assignment required是选项,设置为Yes应用服务 B 的服务主体,那么只有具有角色的用户/服务主体可以访问应用程序,这里有类似的问题。


推荐阅读