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

标签 c# azure azure-active-directory azure-web-app-service

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

基础设置:

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

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

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

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

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

当我使用下面的代码时,我收到有关无法获取 token 的异常。如果我将请求的资源更改为“https://login.microsoftonline.com/ ”,那么我可以获得一个 token ,尽管不是正确的 token (它实际上会获取我的 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 作为有效值返回,以用作不记名 token 。相反,在调用 GetAccessTokenAsync 时,会引发以下异常:

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

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

最佳答案

AzureServiceTokenProvider 在 Azure 上部署时使用托管标识。当不在 Azure 上时,它确实支持其他身份验证选项。您可以使用环境变量中指定的显式服务主体凭据,而无需更改代码。请参阅文档here

关于c# - 我在使用托管服务身份对受 AAD 保护的 Azure 应用服务进行身份验证时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56565043/

相关文章:

c# - 汇编版本所需的格式是什么?

azure - 使用虚拟网络部署容器实例的步骤

azure-active-directory - 在输入用户名之前是否可以重定向到 Azure AD 租户特定的登录页面?

powershell - Azure Powershell 工作流 - 未找到输入参数

azure - 我怎样才能在 Kusto 中执行 "GROUP BY WITH ROLLUP"?

asp.net-core - 在 Identityserver4 .NET Core 中启用多个 AzureAd

powershell - 使用 CmdLet New-AzureRmADAppCredential 创建带有证书的新凭据时出错

c# - 如何从 azure 数据库填充 ListView

c# - 划线还是不划线,这是个问题

c# - 将十进制转换为十六进制