适用于 Azure AD 的 Powerapp 自定义连接器受保护 ASP.Net 核心 WebAPI - 获取未经授权的 401

Powerapp Custom Connector for Azure AD protected ASP.Net Core WebAPI - getting Unauthorized 401

我正在尝试创建一个 MS Powerapp 自定义连接器来访问 ASP.NET 核心 WebAPI,该 Web API 受 Azure AD 使用 Microsoft.Identity.Web 包保护。但无论我如何尝试设置,在尝试通过连接器访问 API 时,我总是收到 401。

所以我的设置是这样的:

Azure 应用注册

我在 Azure App Registrations 中注册了两个应用程序。一份用于 API,一份用于 Powerapp 连接器。

对于 API 注册我只配置了 'Expose an API' 下的设置。我设置了一个应用程序 ID URI

api://f9****ca-****-****-****-3d30e9e*****

并添加了范围

api://f9****ca-****-****-****-3d30e9e*****/Employees.Read.All

我还使用 Powerapp 的应用程序注册 ID 添加了授权客户端应用程序(配置如下)。

Powerapp的应用注册配置如下:

为了身份验证,Web 平台添加了重定向 URI https://global.consent.azure-apim.net/redirect

在 'Certificates & secrets' 下,我添加了一个客户端密码。

在 'Api permissions' 下,我添加了 API api://f9****ca-****-****-****-3d30e9e*****/Employees.Read.All 范围的权限作为 Delegated 权限。

Powerapp 自定义连接器配置

我的自定义连接器的安全选项卡配置如下:

Setting Value
Auth type OAuth 2.0
Identity Provider Azure Active Directory
Client id <Client ID of App reg for Powerapp>
Client Secret <Client secret of App reg for Powerapp>
Login URL https://login.windows.net
Tenant ID <AAD Tenant ID>
Resource URL api://f9****ca-****-****-****-3d30e9e***** <Application ID URI of App reg for API>
Scope api://f9****ca-****-****-****-3d30e9e*****/Employees.Read.All

ASP.net 核心 (3.1) 网络应用程序

我正在使用 Microsoft.Identity.Web nuget 包。

在我的应用程序配置中,我添加了以下内容:

"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"ClientId": "<Client ID of app reg for API>",
"TenantId": "<Tenant ID>"
}

启动 class 看起来像这样:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMicrosoftIdentityWebApiAuthentication(Configuration);
        services.AddControllers();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        
        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

我的控制器刚刚装饰了 [Authorize] 属性。

现在,当我尝试在自定义连接器上测试操作时,WebAPI 总是 returns 一个 401 Unauthorized 而我终究无法弄清楚为什么.

我明白了,请求 header 有一个 Bearer token 用于我用来创建连接的用户。 因此发出了一个令牌,但不知何故 WebApi 认为它无效。

有趣的是,该令牌中的观众是 https://apihub.azure.com。它不应该是应用程序注册的客户端 ID 吗?无论如何,即使我将该受众添加到我的 WebAPI 中的有效受众,我仍然会得到 401...

这里有什么我遗漏的吗?任何帮助将不胜感激。

您忘记添加身份验证中间件。

app.UseAuthentication();
app.UseAuthorization();