【发布时间】:2022-02-04 07:48:27
【问题描述】:
我们有一个简单的设置。前端 Web 应用程序从 Azure AD 获取令牌。前端使用该令牌来验证对我们后端 .NET Core Web API 的请求。两者都将部署为 Azure Web 应用程序。
我们找到了很多关于这个主题的资源(Microsoft Docs、Blogs、Youtube)但是,无论我们尝试什么,当我们从前端向后端发送请求时,都会收到 401 Unauthorized 错误.
这是我们的设置:
-
我们有 2 个应用注册(一个用于前端,一个用于后端)
-
在 Azure 门户中,我导航到 Azure AD -> 应用注册 -> 后端应用 -> 公开 API -> 添加范围 -> 填写表格:
-
然后选择“授予管理员同意”
-
前端代码:
-
在前端,我们使用的是 Microsoft 的 MSAL 库。我们将其配置为:
// Frontend msal config
{
msalConfig: {
auth: {
clientId: "{frontend clientId}",
authority: "https://login.microsoftonline.com/{tenantId}/",
redirectUri: appUri,
postLogoutRedirectUri: appUri,
mainWindowRedirectUri: appUri
},
cache: {
cacheLocation: 'localStorage'
}
}
- 我们发送登录请求:
// login.js
const request = {
scopes: [
"User.Read",
"api://{Backend Application Id From AzureAD App Registration}/access_as_user"
]
};
instance.loginPopup(request).catch(
(error) => {
console.log(error);
}
);
- 这按预期工作,用户可以登录和退出我们的前端应用程序。
- 我们将 Azure AD 提供的令牌放在对后端 API 的请求中的 Authorization 标头中(始终返回 401)。
- 使用 Microsoft.Identity.Web (.NET 5) 的后端代码:
// .Net appsettings.json
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"ClientId": "{backend clientId}",
"TenantId": "{tenantId}"
}
// Startup.cs
using Microsoft.Identity.Web;
ConfigureServices(IServiceCollection services)
{
//other services
services.AddMicrosoftIdentityWebApiAuthentication(Configuration, "AzureAd");
//other services
}
Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// other config
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
// other config
}
任何有关如何进行的帮助将不胜感激。我们现在正在本地进行测试,但是一旦我们开始进行身份验证,我们就会将前端和后端应用程序部署到 Azure Web 应用程序。
更新:
我可以在收到的 401 响应标头中看到:
Bearer error="invalid_token", error_description="签名无效"
【问题讨论】:
-
您的 API 端点是否受到 Authorize 属性的保护?如果是这样,您如何验证用户身份?
-
我已经在我的控制器上放置了 [Authorize] 属性,是的。用户在客户端使用 Azure AD 进行身份验证,然后将他们的令牌发送到我的后端 api,它只返回 401 错误
-
您是否尝试解码您的令牌并比较范围和受众参数?范围(或 scp)是否具有值 access_as_user?受众(或 aud)是否包含后端客户端 ID?可能是该令牌(提供给后端)实际上是用于 Microsoft Graph。
-
@Serhii 我在前端获取并发送到后端的令牌似乎在令牌有效负载中都没有。 "scp": "openid profile User.Read email" ... "aud": "00000003-0000-0000-c000-000000000000"
-
您正在使用 Microsoft Graph 的令牌(在此处查看 appId:shawntabrizi.com/aad/…)。前端已收到 MS Graph 的令牌并将其发送到后端
标签: azure asp.net-core azure-active-directory msal