401 使用 MSAL 查询 .net 5 Web API

401 using MSAL to query .net 5 Web API

我正在将我的 API 从 .Net Core 3.1 迁移到 .Net 5,这涉及更新其身份验证。我正在使用 Azure AD 对我的用户进行身份验证。我可以在我的客户端 React 应用程序中从 MSAL 获取令牌,但无法授权给后端,后端响应为:

Bearer error="invalid_token", error_description="The signature is invalid"

我的前端配置如下所示:

const pca = new PublicClientApplication({
    auth: {
        clientId: process.env.REACT_APP_AZURE_CLIENT,
        authority: `https://login.microsoftonline.com/${process.env.REACT_APP_AZURE_TENANT}/`,
        redirectUri: window.location.origin,
    },
    cache: {
        cacheLocation: 'sessionStorage',
        storeAuthStateInCookie: false,
    },
});

我的后端与 Microsoft 文档告诉我使用的后端没有任何不同,在 Startup.cs:

services.AddMicrosoftIdentityWebApiAuthentication(_configuration, "AzureAd");

我也试过:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.Authority = $"https://login.microsoftonline.com/{_configuration["AzureAd:TenantId"]}/v2.0";
            options.Audience = _configuration["AzureAd:ClientId"];
        });

当我查看我的旧令牌(它们的工作方式几乎相同)时,我可以看到这些字段不同(谢谢 jwt.io)

新:

"aud": "00000003-0000-0000-c000-000000000000",
"iss": "https://sts.windows.net/my-tenant-id/"

旧:

"aud": "my-client-id",
"iss": "https://sts.windows.net/my-tenant-id/"

那么是不是受众部分的问题使得新方法使用默认的 Microsoft 受众?

TL;DR;

我可以使用我的前端代码登录到 Azure AD,但不能使用提供的令牌来调用我的后端,我到底做错了什么?

好吧,答案很简单。我所要做的就是使用:

// Startup.cs
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            const string prefix = "MyConfigPrefix";
            options.Authority = $"{_config[$"{prefix}:Instance"]}{_config[$"{prefix}:TenantId"]}/";
            options.Audience = _config[$"{prefix}:ClientId"];
        });

...

// adal.js

// In my token-request
const tokenRequest = { scopes: [`${process.env.REACT_APP_AZURE_CLIENT}/.default`] };

这在请求令牌时为我提供了正确的受众,并在我的后端进行了验证。因此,对于卡在这里的任何其他人,请在请求令牌时使用正确的范围。

更具体地说:

请求令牌时执行此操作:

const token = await pca.acquireTokenSilent({ scopes: [`${process.env.REACT_APP_AZURE_CLIENT}/.default`] });