当SPA与后端API通信时,我对Azure B2C的工作原理感到困惑。我们有一个从ASPNet核心Web API检索数据的VUE应用程序。我连接了VUE和Azure B2C上的APP,我可以登录并检索访问令牌,但是…
SPA和API之间的身份验证/授权是如何工作的?
TIA
当SPA与后端API通信时,我对Azure B2C的工作原理感到困惑。我们有一个从ASPNet核心Web API检索数据的VUE应用程序。我连接了VUE和Azure B2C上的APP,我可以登录并检索访问令牌,但是…
SPA和API之间的身份验证/授权是如何工作的?
TIA
Authorization
头中的API(Authorization: Bearer $token$
)。然后,API可以根据JWT的签名块验证令牌,以验证该令牌是由安全令牌服务发出并且未被修改。由于STS与API之间的信任关系(API信任STS),因此API基于所呈现的JWT对各种API调用进行认证和授权。
既然您已经让SPA工作并获取了令牌,接下来需要做的就是设置Web API以接受B2C的JWT。使用Microsoft.AspNetCore.Authentication.JwtBearer,以下代码应该可以帮助您快速上手。
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
};
});
(以上代码来自 Azure示例,不再维护。)
理想情况下,SPA和API都应该作为单独的客户端在STS中注册,但您可以使用相同的客户端ID,这样您就不需要保留两组令牌,一组用于SPA客户端,另一组用于API。在我目前正在处理的项目中,多个SPA被注册为客户端,然后API有一个AddJwtBearer
,它接受多个观众。
.AddJwtBearer(options =>
{
options.Authority = $"https://login.microsoftonline.com/tfp/{Configuration["AzureAdB2C:Tenant"]}/{Configuration["AzureAdB2C:Policy"]}/v2.0/";
options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
{
ValidateIssuer = true,
ValidAudiences = new List<string>
{
Configuration["AzureAdB2C:ClientId1"];,
Configuration["AzureAdB2C:ClientId2"];
}
};
}
希望您了解Web应用程序/SPA注册过程,例如
同样地,我们将创建一个Web API
webapi1
。然后我们需要配置作用域。这些作用域提供了一种管理对受保护资源的访问的方式。Web API使用作用域来实现基于作用域的访问控制。请参阅文档,了解如何为Web API提供作用域。
并且需要在我们最初创建的Web APP中向Web API授予权限。此权限有助于验证/授权Web APP生成的访问令牌在Web API上。请按照文档中所述的步骤进行操作。