从Azure AD B2C获得JWT令牌但在ASP.NET Core应用程序中获得401错误

时间:2018-05-15 20:13:07

标签: asp.net asp.net-core jwt azure-ad-b2c

我在新的ASP.NET Core 2.1应用程序中实现Azure AD B2C。

我已经创建了Azure AD B2C租户并注册了我的应用程序等。

登录后,我被重定向到我指定的URL,我在URL中看到了令牌,但是我收到一条错误,说明应用需要身份验证 - 请参阅下文: enter image description here

我看到了一些类似的帖子,我收集的是令牌由中间件自动验证。那不是这样吗?

此时我需要做什么?

我在应用中包含的代码如下:

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
   };
});

Configure()中的Startup.cs方法中,我所拥有的只是app.UseAuthentication();

在我的控制器中,我还使用[Authorize]来确保我的操作不对匿名用户开放。

我错过了什么?如何验证令牌并获得声明?

1 个答案:

答案 0 :(得分:1)

将我们的讨论结合起来作为答案。

此类应用程序的典型方法是允许未经身份验证的客户端下载HTML,JS和其他静态内容。

然后前端可以使用MSAL.JS对用户进行身份验证。 前端SPA将获得一个Id令牌,告诉前端用户是谁。 MSAL.JS还允许您访问令牌以调用API。 它使用隐藏的iframe + Implicit Grant流来执行此操作。 然后,该访问令牌需要作为标题(Authorization: Bearer token-goes-here)附加到API的请求。

MSAL.JS将使用会话或本地存储来存储令牌(这是可配置的)。 因此,此设置中不使用任何cookie。

然后,后端API应该验证它在标头中收到的访问令牌。 您拥有的内容已足以验证令牌。

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
   };
});

JWT Bearer身份验证处理程序将在启动时从此处配置的权限加载OpenId Connect元数据文档。 这使得它可以获得B2C租户的公共签名密钥等。 此信息允许处理程序在进入时验证访问令牌,而无需以任何方式与B2C交互。 它检查签名是否有效,发行者是否有效,以及令牌中的受众是否已配置。

授权当然不是由身份验证处理程序处理的,因此您还必须检查是否允许主动用户访问他们正在访问的资源。 用户标识在访问令牌中可用。

MSAL.JS也可能已经对令牌进行了一些验证(如果确实如此,我现在还记不起来了),但是在前端进行验证是任何可以控制权限的人都可以解决的问题。用户的浏览器。 API方面的验证是最重要的部分。