如何在 Web API 中验证 Azure B2C JWT 令牌?

Posted

技术标签:

【中文标题】如何在 Web API 中验证 Azure B2C JWT 令牌?【英文标题】:How to validate an Azure B2C JWT token in a web API? 【发布时间】:2021-11-16 02:09:27 【问题描述】:

按照标题的字面意思,我可以通过我的 Web 客户端从 Azure B2C 获取令牌,现在我需要做的就是在我的 API 中验证它。

这是我的appsettings.json(细节已更改,但显示的编号 GUID 在真实文件中相互匹配):


  "AzureAdB2C": 
    "Authority": "https://login.mydomain.net/00000000-0000-0000-0000-000000000000",
    "Audience": "11111111-1111-1111-1111-111111111111",
    "Instance": "https://login.mydomain.net",
    "Domain": "mydomain.net",
    "ClientId": "11111111-1111-1111-1111-111111111111",
    "TenantId": "00000000-0000-0000-0000-000000000000"
  ,
  "ConnectionStrings": 
    "SQLConnection": "Data Source=MyAppDebug.db;Cache=Shared"
  ,
  "Logging": 
    "LogLevel": 
      "Default": "Warning"
    
  ,
  "AllowedHosts": "*"

我已经在我的Startup.cs 中尝试过这些:

// Throws "System.InvalidOperationException: No authenticationScheme was specified, and
// there was no DefaultChallengeScheme found."
services.AddAuthentication()
                .AddMicrosoftIdentityWebApi(Configuration.GetSection("AzureAdB2C"));
// Throws "System.InvalidOperationException: IDX20803: Unable to obtain configuration
// from: 'System.String'."
services.AddMicrosoftIdentityWebApiAuthentication(Configuration, Constants.AzureAdB2C);
// Throws "System.InvalidOperationException: IDX20803: Unable to obtain configuration
// from: 'System.String'."
services.AddAuthentication(options =>
            
                options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
            ).AddJwtBearer(options =>
            
                options.Audience = Configuration["AzureAdB2C:Audience"];
                options.Authority = Configuration["AzureAdB2C:Authority"];
            );
// Throws "System.InvalidOperationException: IDX20803: Unable to obtain configuration
// from: 'System.String'."
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddMicrosoftIdentityWebApi(
                    (jwtOptions) =>
                    
                        // I've commented this out because I don't yet have roles set up in
                        // Azure, but I have to include something for jwtOptions otherwise
                        // it won't build.
                        //// jwtOptions.TokenValidationParameters.RoleClaimType = "groups";
                    ,
                    (options) =>
                    
                        options.ClientId = this.Configuration["AzureAdB2C:ClientId"];
                        options.TenantId = this.Configuration["AzureAdB2C:TenantId"];
                        options.Domain = this.Configuration["AzureAdB2C:Domain"];
                        options.Instance = this.Configuration["AzureAdB2C:Instance"];
                    );

我束手无策,不明白这怎么这么难。像往常一样,Microsoft 指南和文档毫无用处。

我有一个有效的 JWT 令牌,我要做的就是验证它的签名、受众、颁发者和声明。到目前为止,与设置 B2C 目录、注册 Google 开发帐户并获取凭据以添加到 Azure、注册我的应用程序、添加我自己的自定义范围、创建客户端机密、实施进入我的网络应用并注册新用户。

【问题讨论】:

【参考方案1】:

我之前在 ADFS 的上下文中写过 this,但原理是一样的。

B2C 也有一个well-known endpoint,您可以使用它来检查签名。

另外,对于.NET Core。

还有大量的库here。

【讨论】:

谢谢你,我终于发现我错误地构造了颁发者 URL,因为没有包括最初颁发令牌的策略名称。我已经发布了我最终使用的更简洁的代码。您提供的第三个链接将非常有用,因为我现在需要构建一些可以动态创建令牌以进行单元测试的东西,因为我从旧身份验证方法进行的所有测试现在都搞砸了!【参考方案2】:

我最终发现我(或者更确切地说,API)没有正确构建颁发者的 URL,它需要包含用于创建令牌的策略(注册/登录策略)。

这是我在appsettings.json 文件中需要的:

"AzureAdB2C": 
    "Instance": "https://login.mydomain.net",
    "ClientId": "00000000-0000-0000-0000-000000000000",
    "TenantId": "11111111-1111-1111-1111-111111111111",
    "SignUpSignInPolicyId": "B2C_1_SignUpIn"
  

这是我在Startup.cs中使用的代码:

services.AddAuthentication(options =>  options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; )
    .AddJwtBearer(jwtOptions =>
        
            jwtOptions.Authority =
                $"Configuration["AzureAdB2C:Instance"]/Configuration["AzureAdB2C:TenantId"]/Configuration["AzureAdB2C:SignUpSignInPolicyId"]/v2.0/";
            jwtOptions.Audience = Configuration["AzureAdB2C:ClientId"];
        );

话虽如此,我得到的异常类型和消息非常无用。

【讨论】:

【参考方案3】:

您必须在 appsettings.json 配置中包含“SignUpSignInPolicyId”。如果您使用的是自定义策略,请确保使用准确的策略名称。

【讨论】:

是的,还有一点需要注意——微软为了让一切变得更简单,隐藏了一些不明显的默认值,例如如果您使用 Microsoft.Identity.Web 向应用程序添加身份验证并为其提供不带其他参数的 IConfiguration 对象,则假定相关配置部分名为“AzureAd”。这是一个可以更改的可选参数,但如果您刚开始使用这种东西,它并不是很明显。与策略名称相同。

以上是关于如何在 Web API 中验证 Azure B2C JWT 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

Azure AD B2C 与 ASP.NET Web API 发出令牌,用于 Web API 中的身份验证和访问 MS Graph API

如何通过 Azure AD B2C 使用身份验证功能在 Azure Web App 上添加身份验证?

Azure B2C 身份验证中的“范围”有啥用途?

如何使用 api 连接器和 asp net core web api 通过自定义声明丰富 azure b2c 令牌

我们如何在 Xamarin 表单中删除/自定义 Azure AD B2C 身份验证 webview 页面标题栏?

ASP.NET 5 API - Azure AD B2C