首页 > 解决方案 > 适用于 Azure AD 保护的 ASP.Net Core WebAPI 的 Powerapp 自定义连接器 - 获得未经授权的 401

问题描述

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

所以我的设置如下所示:

Azure 应用注册

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

对于 API 注册,我只在“公开 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

在“证书和机密”下,我添加了一个客户端机密。

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

Powerapp 自定义连接器配置

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

环境 价值
认证类型 OAuth 2.0
身份提供者 Azure 活动目录
客户编号 <Client ID of App reg for Powerapp>
客户秘密 <Client secret of App reg for Powerapp>
登录网址 https://login.windows.net
租户编号 <AAD Tenant ID>
资源网址 api://f9****ca-****-****-****-3d30e9e***** <Application ID URI of App reg for API>
范围 api://f9****ca-****-****-****-3d30e9e*****/Employees.Read.All

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

我正在使用Microsoft.Identity.Webnuget 包。

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

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

启动类如下所示:

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 总是返回 a 401 Unauthorized,我终生无法弄清楚原因。

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

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

我在这里有什么遗漏吗?任何帮助将非常感激。

标签: asp.net-corepowerapps

解决方案


您忘记添加 Authenction 中间件。

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

推荐阅读