Azure AD,使用自定义应用程序 ID URI 调用 Web API 的客户端机密应用程序,returns 401
AzureAD, Client confidential app calling webapi with a custom Application ID URI, returns 401
我正在尝试开发一个可以从不同网络应用程序调用的 API。
如果我使用默认范围 (api://[APIclientId]/.default) 使用客户端机密应用程序调用 api,一切正常。
但是如果我为 API 应用程序注册指定一个自定义应用程序 ID URI(例如:api://myapi.iss.it),并且我将范围设置为 api://myapi.iss.it/.default,我从 webapp 获取 HTTP401。
这是为 webapp 检索令牌以调用 api:
的方法
private async Task PrepareAuthenticatedClient()
{
IConfidentialClientApplication app;
string AURY = String.Format(CultureInfo.InvariantCulture, _config["AzureAd:Instance"] + "{0}", _config["AzureAd:TenantId"]);
app = ConfidentialClientApplicationBuilder.Create(_config["AzureAd:ClientId"])
.WithClientSecret(_config["AzureAd:ClientSecret"])
.WithAuthority(new Uri(AURY))
.Build();
var accessToken = await app.AcquireTokenForClient(new string[] { _config["API:scope"] }).ExecuteAsync();
Console.WriteLine("token: " + accessToken.AccessToken);
//var accessToken = await _tokenAcquisition.GetAccessTokenForAppAsync(_TodoListScope);
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.AccessToken);
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
我注意到令牌中的受众仍然是 api://[APIclientId],即使我将 api:scope 设置为 api:/ /myapi.iss.it/.default
是否正确?
知道可能是什么问题吗?
我在微软问答平台上得到了答案
基本上,我没有在 API 应用程序中指定受众,所以默认情况下它是“api://[APIclientId]”。
当 API 正在验证应用程序的令牌时(其中 aud 为 api://myapi.iss.it),引发了异常“Microsoft.IdentityModel.Tokens.SecurityTokenInvalidAudienceException”,并且 API 返回 401。
如果您遇到同样的问题,并且您使用的是 Microsoft.Indentity.Web 库,则在 appsetting.json 中指定受众可能就足够了。
我正在尝试开发一个可以从不同网络应用程序调用的 API。
如果我使用默认范围 (api://[APIclientId]/.default) 使用客户端机密应用程序调用 api,一切正常。
但是如果我为 API 应用程序注册指定一个自定义应用程序 ID URI(例如:api://myapi.iss.it),并且我将范围设置为 api://myapi.iss.it/.default,我从 webapp 获取 HTTP401。
这是为 webapp 检索令牌以调用 api:
的方法 private async Task PrepareAuthenticatedClient()
{
IConfidentialClientApplication app;
string AURY = String.Format(CultureInfo.InvariantCulture, _config["AzureAd:Instance"] + "{0}", _config["AzureAd:TenantId"]);
app = ConfidentialClientApplicationBuilder.Create(_config["AzureAd:ClientId"])
.WithClientSecret(_config["AzureAd:ClientSecret"])
.WithAuthority(new Uri(AURY))
.Build();
var accessToken = await app.AcquireTokenForClient(new string[] { _config["API:scope"] }).ExecuteAsync();
Console.WriteLine("token: " + accessToken.AccessToken);
//var accessToken = await _tokenAcquisition.GetAccessTokenForAppAsync(_TodoListScope);
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.AccessToken);
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
我注意到令牌中的受众仍然是 api://[APIclientId],即使我将 api:scope 设置为 api:/ /myapi.iss.it/.default
是否正确? 知道可能是什么问题吗?
我在微软问答平台上得到了答案
基本上,我没有在 API 应用程序中指定受众,所以默认情况下它是“api://[APIclientId]”。 当 API 正在验证应用程序的令牌时(其中 aud 为 api://myapi.iss.it),引发了异常“Microsoft.IdentityModel.Tokens.SecurityTokenInvalidAudienceException”,并且 API 返回 401。
如果您遇到同样的问题,并且您使用的是 Microsoft.Indentity.Web 库,则在 appsetting.json 中指定受众可能就足够了。