首页 > 解决方案 > 使用 .NET 5 调用受 Azure B2C 保护的 Web API

问题描述

我正在尝试调用受 Azure B2C 保护的 Web API。我正在使用 .NET 5。我还使用 Azure B2C 来保护我的 WebApp。

在我的 WebAppstartup.cs中,我有:

services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
   .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAdB2C"))
   .EnableTokenAcquisitionToCallDownstreamApi()
   .AddDownstreamWebApi("API", Configuration.GetSection("AzureB2API"))
   .AddInMemoryTokenCaches();

ITokenAcquisition用来获取访问令牌。我试过IDownstreamWebApi了,但是没有用。

string accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(Scopes);

我遇到的问题是,我收到的访问令牌的版本是版本 1。但是,Web API 需要版本 2。

我尝试在 Azure B2C WebAPI ( accessTokenAcceptedVersion) 的清单中将版本更改为 1,但它不会接受更改。

任何建议将不胜感激。

Web API 的 startup.cs 是:

services.AddMicrosoftIdentityWebApiAuthentication(Configuration, "AzureAd");

标签: c#azureazure-active-directoryasp.net5

解决方案


请检查以下是否可以解决。

AddInMemoryTokenCaches 添加一个内存令牌缓存提供程序,它将缓存为下游 Web API 获取的访问令牌。

services.AddMicrosoftIdentityWebAppAuthentication(Configuration, "AzureAdB2C") .EnableTokenAcquisitionToCallDownstreamApi(new string[] { Configuration["TodoList:TodoListScope"] }) .AddInMemoryTokenCaches(); services.AddInMemoryTokenCaches();

因此,您可以在更改接受的版本后清除缓存,这样应用程序就不会采用缓存和使用的先前版本,直到它过期。 参考1

正如您提到的 Web API 需要版本 2,我认为您可能必须在调用门户中的 Web api 的 Azure B2C WebAPP 的清单中将 accessTokenAcceptedVersion 更改为 2。

"accessTokenAcceptedVersion": 2,

笔记

  1. 如果 Supported account types 的值为 Accounts in any organization directory 和个人 Microsoft 帐户(例如 Skype、Xbox、Outlook.com),则接受的令牌版本必须是 v2.0。
  2. 否则,接受的令牌版本可以是 v1.0
  3. 如果值为 2,则 Web API 接受 v2.0 令牌。
  4. 如果值为 null,则 Web API 接受 v1.0 令牌。

其他要点:还要检查受保护的 Web API 应用程序注册的范围和权限

/ ASP.NET 核心模板当前使用 Azure AD v1.0,并计算 // 权限(作为 {Instance}/{TenantID})。我们要使用 Microsoft Identity Platform v2.0 端点
options.Authority = options.Authority + "/v2.0/";

也看到这个


推荐阅读