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`] });
我正在将我的 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`] });