我在使用托管服务身份对受 AAD 保护的 Azure 应用服务进行身份验证时遇到问题

2024-02-03

我正在尝试使用 HttpClient 连接到 Azure 应用服务中托管的 Web 服务,该服务使用托管服务标识通过 AAD 进行保护。 尝试使用 AzureServiceTokenProvider 从客户端代码连接时,尝试获取令牌时出现 AzureServiceTokenProviderException

基础设置:

AAD 租户 AADX.onmicrosoft.com 包含目标应用程序服务 mytest 的应用程序注册。它的应用程序 ID 为 XXXXXXX-XXXX-49e6-a806-5440b00282b1,根据清单,它的标识符 URL 为“https://AADX.onmicrosoft.com/mytest https://AADX.onmicrosoft.com/mytest"

已在此 AAD 下的订阅中创建应用程序服务“mytest”,因此具有 URLhttps://mytest.azurewebsites.net https://mytest.azurewebsites.net

在应用程序服务的身份验证设置中,“应用程序服务身份验证”已打开。请求未经身份验证时采取的操作设置为“使用 Azure Active Directory 登录”。 AAD 身份验证提供程序使用快速设置进行配置,指向 AADX 并使用“mytest”应用程序。

我们有资源需要在我们的 azure 租户内部和外部与此应用程序服务进行通信。 Azure 租户外部的资源通过 API 管理路由到它们所需的 API 的特定部分,并以受控方式使用订阅密钥。

RemoteApp 中托管的应用程序服务和桌面应用程序需要访问该应用程序下托管的完整服务。为租户内需要连接的所有基础设施开启托管身份。

当我使用下面的代码时,我收到有关无法获取令牌的异常。如果我将请求的资源更改为“https://login.microsoftonline.com/ https://login.microsoftonline.com/“然后我可以获得一个令牌,尽管不是正确的令牌(它实际上获取了我的 MS 在线登录信息,而不是在选项中选择的帐户)

        private static HttpClient ConnectToClient()
        {
            String BaseUrl = "https://mytest.azurewebsites.net/";
            String AdResource = "https://AADX.onmicrosoft.com/mytest";

            AzureServiceTokenProvider TokenProvider = new AzureServiceTokenProvider();
            String Token = TokenProvider.GetAccessTokenAsync(AdResource).Result;

            HttpClient Client = new HttpClient()
            {
                BaseAddress = new Uri(BaseUrl)
            };

            Client.DefaultRequestHeaders.Accept.Clear();
            Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));


            Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Token);

            return Client;
        }

        private static String GetContent()
        {
            String Output = String.Empty;

            using (HttpClient Client = ConnectToClient())
            {
                HttpResponseMessage ResponseMessage = Client.GetAsync("api/Test/").Result;

                if (ResponseMessage.IsSuccessStatusCode)
                {
                    Output = ResponseMessage.Content.ReadAsStringAsync().Result;
                }
            }

            return Output;
        }

我希望 Token 作为有效值返回,以用作不记名令牌。相反,在调用 GetAccessTokenAsync 时,会引发以下异常:

系统聚合异常 H结果=0x80131500 消息=发生一个或多个错误。 (参数:连接字符串:[未指定连接字符串],资源:https://AADX.onmicrosoft.com/mytest https://AADX.onmicrosoft.com/mytest, 权威: 。异常消息:尝试了以下3种方法来获取访问令牌,但都不起作用。

参数:连接字符串:[未指定连接字符串],资源:https://AADX.onmicrosoft.com/mytest https://AADX.onmicrosoft.com/mytest, 权威: 。异常消息:尝试使用托管服务身份获取令牌。无法连接到托管服务身份 (MSI) 端点。请检查您是否在具有 MSI 设置的 Azure 资源上运行。 参数:连接字符串:[未指定连接字符串],资源:https://AADX.onmicrosoft.com/mytest https://AADX.onmicrosoft.com/mytest, 权威: 。异常消息:尝试使用 Visual Studio 获取令牌。无法获取访问令牌。 Visual Studio 令牌提供程序 Microsoft.Asal.TokenService.exe 的异常:TS003:错误,TS004:无法获取访问令牌。 “刷新访问令牌失败”


AzureServiceTokenProvider 在 Azure 上部署时使用托管标识。当不在 Azure 上时,它确实支持其他身份验证选项。您可以使用环境变量中指定的显式服务主体凭据,而无需更改代码。请参阅文档here https://learn.microsoft.com/en-us/azure/key-vault/service-to-service-authentication#running-the-application-using-a-service-principal.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我在使用托管服务身份对受 AAD 保护的 Azure 应用服务进行身份验证时遇到问题 的相关文章

随机推荐