我正在尝试开发一个可以从不同的web应用程序调用的API。
如果我使用客户端机密应用程序调用api,使用默认作用域(api://[APIclientId]/.default(,一切都会正常。
但是,如果我为API应用程序注册指定自定义应用程序ID URI(如:api://myapi.iss.it),并且我将范围设置为api://myapi.iss.it/.default,我从网络应用程序获得HTTP401。
这是为Web应用程序检索令牌以调用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"));
}
我注意到Audience在令牌中仍然是api://[APIclientId],即使我将api:scope设置为api://myapi.iss.it/.default
这是正确的吗?知道问题出在哪里吗?
我在微软问答上得到了解决方案;一个平台。
基本上,我没有在API应用程序中指定Audience,所以默认情况下它是";api://[APIclientId]";。API验证应用程序的令牌时(aud所在的位置api://myapi.iss.it),例外";Microsoft.IdentityModel.Tokens.SecurityTokenInvalidAudienceException";引发,API返回401。
如果您有同样的问题,并且您正在使用Microsoft.Indentity.Web库,那么在appsetting.json中指定Audience可能就足够了。