【发布时间】:2020-12-02 19:11:14
【问题描述】:
我有两个 Web API 服务(源和目标)。每个都使用客户端机密向 Azure B2C 注册为 AD 应用程序。
我正在尝试从源服务调用 gRPC API 调用到目标服务 API,但是当我尝试进行调用时,我是 gRPC 异常,表明源未经身份验证。
注意:当我从目标 WebAPI 中删除 Scope Policy 和 Authorized 属性时,一切正常,但这当然不安全。
在源服务启动中我有以下...
注意:源和目标的配置设置都是正确的。我已经三次检查所有配置设置是否正确。
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddMicrosoftIdentityWebApi(options =>
{
Configuration.Bind("AzureAdB2C", options);
options.TokenValidationParameters.NameClaimType = "name";
},
options =>
{
Configuration.Bind("AzureAdB2C", options);
});
我不确定它是否需要,但我还在源 API 的启动中包含了以下逻辑。
注意:我现在已经硬编码了所需的范围。
services.AddMicrosoftIdentityWebAppAuthentication(Configuration, "AzureAdB2C")
.EnableTokenAcquisitionToCallDownstreamApi(new string[] { "https://nextwaredev.onmicrosoft.com/nextware.productportal.sharedservices.api/sharedservices_readaccess", "https://nextwaredev.onmicrosoft.com/nextware.productportal.sharedservices.api/sharedservices_readwriteaccess" })
.AddInMemoryTokenCaches();
目标服务具有正确的策略,并且两个服务都配置为使用授权和身份验证..
app.UseAuthentication();
app.UseAuthorization();
我已经根据上面的相同范围向源添加了所需的 API 权限..
当我尝试在目标 API 上调用方法时,我返回一个 gRPC 异常,指出源未经身份验证。
然后我想也许我需要传递一个应用程序访问令牌但是当我尝试获取 JWT 访问令牌时(在 this example 调用 tokenAcquisition.GetAccessTokenForAppAsync 之后)我得到另一个异常“AADB2C90086:提供的grant_type [client_credentials]不支持。”
注意:我有一个 Blazor 应用程序调用相同的安全 API 没有问题。但是在那里我调用 GetAccessTokenForUserAsync... 它返回正确的令牌,其中包含调用相同下游源或目标 Web api 服务所需的应用范围。
我是否需要在启动时包含 AddMicrosoftIdentityWebAppAuthentication? 我还做错了什么?
感谢您的帮助! 干杯
【问题讨论】:
-
能否请您告诉我您如何调用目标 API
标签: c# asp.net-web-api azure-ad-b2c msal