我在新的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
};
});
在Configure()
中的Startup.cs
方法中,我所拥有的只是app.UseAuthentication();
在我的控制器中,我还使用[Authorize]
来确保我的操作不对匿名用户开放。
我错过了什么?如何验证令牌并获得声明?
答案 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方面的验证是最重要的部分。