Azure AD B2C与SPA和Web API的集成

4

当SPA与后端API通信时,我对Azure B2C的工作原理感到困惑。我们有一个从ASPNet核心Web API检索数据的VUE应用程序。我连接了VUE和Azure B2C上的APP,我可以登录并检索访问令牌,但是…

SPA和API之间的身份验证/授权是如何工作的?

TIA

2个回答

3
Azure B2C使用OATH 2 / OpenID Connect作为保护单页应用程序和API的主要方式。OATH 2使用Json Web Tokens(无状态加密签名令牌)在多个服务之间提供身份验证(OpenID Connect是OATH 2的扩展)。
客户端应用程序(在这种情况下是SPA)将请求Azure AD B2C以获取JWT令牌。如果用户已登录B2C,则安全令牌服务将为SPA发出令牌。
当SPA调用API时,来自安全令牌服务的ID令牌(在OpenID Connect流程中)将发送到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"]; 
        }
    };
}

这为我的应用程序提供了足够的安全性,API不需要在IDP中注册为客户端。

你是说使用相同的客户端ID?当我在应用程序注册中注册SPA和API时,它会生成2个不同的客户端ID。 #2 你是如何管理角色/权限的?使用清单文件吗? - Ali
1
@Ali 我将所有的SPA都注册为独立的客户端,每个客户端都有自己的客户端ID。由于B2C的JWT令牌的有效受众设置为客户端ID,因此API接受具有X有效受众的令牌意味着您不需要将API注册为客户端,从而拥有自己的客户端和受众。它验证了令牌是否符合预期的客户端。 - RubberChickenLeader
1
@Ali,为了授权,我使用安全组来授予各种应用程序的访问权限。主要的遗留应用程序有自己的角色和权限结构。最终,我将把角色分配提升到B2C,但在初始推出中,权限和组由每个单独的应用程序处理。这不是最好的方法,但可以使我卸载身份验证并更快地上市。 - RubberChickenLeader

-1

希望您了解Web应用程序/SPA注册过程,例如

  1. 选择App注册,选择Owned应用程序选项卡,然后选择webapp1应用程序。
  2. 在Web下,选择Add URI链接,输入http://localhost:6420。
  3. 在Implicit Grant下,选择访问令牌和ID令牌的复选框,然后选择保存。
  4. 记录应用程序(客户端)ID以在稍后更新单页Web应用程序中的代码时使用。

同样地,我们将创建一个Web API

  1. 选择App注册,然后选择新注册。
  2. 为应用程序输入名称。例如,webapi1
  3. 在Redirect URI下,选择Web,然后输入Azure AD B2C应返回应用程序请求的任何令牌的终结点。在本教程中,示例在本地运行并侦听http://localhost:5000。
  4. 记录应用程序(客户端)ID以在稍后使用。

然后我们需要配置作用域。这些作用域提供了一种管理对受保护资源的访问的方式。Web API使用作用域来实现基于作用域的访问控制。请参阅文档,了解如何为Web API提供作用域。

并且需要在我们最初创建的Web APP中向Web API授予权限。此权限有助于验证/授权Web APP生成的访问令牌在Web API上。请按照文档中所述的步骤进行操作。


嗨,感谢您的回复,我已完成第一部分,对于第二部分,我将进行设置。 但是,SPA如何向在同一端口下运行的WebAPI发送令牌呢? - Ali
使用Azure AD B2C登录后,将生成一个令牌。接收到的令牌包含“iss”和“aud”声明信息。您可以通过解码令牌来查看此信息。当您在Web API中授予Web应用程序(公开API权限)的权限时,在Web API中提供“Authority”和“Audience”详细信息,这将验证传入的请求。有关更多详细信息,请参阅此文档 - Raghavendra beldona

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接