【发布时间】:2018-10-25 18:38:42
【问题描述】:
我正在一个新的 ASP.NET Core 2.1 应用中实施 Azure AD B2C。
我已经创建了 Azure AD B2C 租户并注册了我的应用等。
登录后,我被重定向到我指定的 URL,我在 URL 中看到了令牌,但我收到一条错误消息,指出应用程序需要身份验证 - 见下文:
我看到了一些类似的帖子,我收集到的是令牌由中间件自动验证。不是这样吗?
此时我需要做什么?
我的应用中包含的代码如下:
在ConfigureServices()方法中:
services.AddAuthentication(options => {
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(jwtOptions => {
jwtOptions.Authority = $"https://login.microsoftonline.com/tfp/{Configuration["AzureAdB2C:Tenant"]}/{Configuration["AzureAdB2C:Policy"]}/v2.0/";
jwtOptions.Audience = Configuration["AzureAdB2C:ClientId"];
jwtOptions.Events = new JwtBearerEvents
{
OnAuthenticationFailed = AuthenticationFailed
};
});
在Startup.cs 的Configure() 方法中,我只有app.UseAuthentication();
在我的控制器中,我还使用[Authorize] 来确保我的操作不对匿名用户开放。
我错过了什么?如何验证令牌并获取声明?
【问题讨论】:
-
在我写答案之前要问您一个问题:您的应用是 API 还是带有用户交互界面的应用?因为您将 JWT Bearer 身份验证(用于 API)与交互式身份验证返回的 id 令牌(由交互式应用程序使用)混合在一起。
-
这是一个带有 ASP.NET Core API 后端的 ReactJs SPA 应用程序,因此只有一个页面可以下载所有前端的 JS 文件。剩下的就是 API。我只想使用 JWT 身份验证——即使是索引页面——以保持简单。
-
好吧,这是另一种常见的模式。 JWT 身份验证中间件不会读取片段中的 id 令牌。您将不得不使用 MSAL.JS(或其他支持的 OIDC 库)在客户端对用户进行身份验证,然后将 id 令牌作为访问令牌附加到每个请求的标头中。
-
那我的索引页面呢?这是我的前端应用程序的入口点,我想确保只将它提供给经过身份验证的用户。
-
目前还不能直接使用。我想您可以以某种方式制作一些东西来验证片段中的 id 令牌,但通常应用程序的静态文件不被认为是有价值的。
标签: asp.net asp.net-core jwt azure-ad-b2c