我正在尝试使用 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:无法获取访问令牌。 “刷新访问令牌失败”