Azure AD,客户端机密应用程序调用具有自定义应用程序 ID URI 的 web api,返回 401

Posted

技术标签:

【中文标题】Azure AD,客户端机密应用程序调用具有自定义应用程序 ID URI 的 web api,返回 401【英文标题】:AzureAD, Client confidential app calling webapi with a custom Application ID URI, returns 401 【发布时间】:2021-09-26 03:51:27 【问题描述】:

我正在尝试开发一个可以从不同的网络应用程序调用的 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"));
    

我注意到令牌中的 Audience 仍然是 api://[APIclientId],即使我将 api:scope 设置为 api://myapi.iss.it/.default

正确吗? 知道可能是什么问题吗?

【问题讨论】:

【参考方案1】:

我在微软问答平台上得到了解决方案。

基本上,我没有在 API 应用程序中指定 Audience,所以默认为“api://[APIclientId]”。 当 API 验证应用的令牌(aud 为 api://myapi.iss.it)时,引发了异常“Microsoft.IdentityModel.Tokens.SecurityTokenInvalidAudienceException”,API 返回 401。

如果您有同样的问题,并且您正在使用 Microsoft.Indentity.Web 库,那么在 appsetting.json 中指定 Audience 可能就足够了。

【讨论】:

以上是关于Azure AD,客户端机密应用程序调用具有自定义应用程序 ID URI 的 web api,返回 401的主要内容,如果未能解决你的问题,请参考以下文章

Azure AD 应用程序注册中的 Client Secret 最长到期时间修改为 2 年

Azure AD 应用程序注册中的 Client Secret 最长到期时间修改为 2 年

通过自定义 UI 进行 Windows Azure AD 用户注册

为 Azure AD B2C 自定义策略调用 New-CpimCertificate 时出现问题

Asp Core:Azure Ad Auth + 自定义 JWT + 自定义身份存储

Azure AD B2C 自定义策略