asp.net-core - 适用于 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.Web
nuget 包。
在我的应用配置中,我添加了以下内容:
"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
...
我在这里有什么遗漏吗?任何帮助将非常感激。
解决方案
您忘记添加 Authenction 中间件。
app.UseAuthentication();
app.UseAuthorization();
推荐阅读
- ruby-on-rails - 在输入字段上生成随机数
- java - __groovy 中的 Java 函数执行,但结果未分配给变量
- android - 在电子邮件中打开链接以在应用程序中而不是在网站中进行确认
- android - 关于 Chrome Android 扩展支持的官方来源
- php - ElasticSearch 正则表达式 pattern_replace
- angular - 多次调用 ngOnint() 服务方法内部
- interface - SystemVerilog 接口的放置位置,以及如何命名接口和文件
- java - How to compile tflite with GPU support?
- sql - Why are a Tableau Data Source and Sheet showing different data?
- mysql - 如何使mysql表中的主键和当前时间戳列同步