在 ASP.NET Core 中支持多个 JWT 令牌颁发者
本指南介绍了如何配置 ASP.NET Core 以对来自多个源(例如 Firebase 和自定义颁发者)的 JWT 进行身份验证。 标准的 AddJwtBearer
方法仅支持单个权限,这使得这是一个常见的挑战。
解决方案:多种身份验证方案
关键是在 ASP.NET Core 中利用多种身份验证方案。 这允许应用程序独立处理来自不同发行者的 JWT。
实现(ASP.NET Core 2 及更高版本):
<code class="language-csharp">services .AddAuthentication() // No default scheme specified .AddJwtBearer("Firebase", options => { options.Authority = "https://securetoken.google.com/my-firebase-project"; options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = "my-firebase-project", ValidateAudience = true, ValidAudience = "my-firebase-project", ValidateLifetime = true }; }) .AddJwtBearer("Custom", options => { // Configure validation parameters for your custom JWT issuer here. // Example: options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = "your-custom-issuer", ValidateAudience = true, ValidAudience = "your-api-audience", ValidateLifetime = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your-secret-key")) // Or your key retrieval method }; }); services .AddAuthorization(options => { options.DefaultPolicy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .AddAuthenticationSchemes("Firebase", "Custom") .Build(); });</code>
主要改进:
AddAuthentication()
调用时不带参数。这可以防止使用单一方案进行自动身份验证,从而允许所有定义的方案尝试进行身份验证。AddJwtBearer
与方案名称(“Firebase”、“自定义”)一起使用来单独注册每个颁发者。处理错误:
在身份验证失败期间,您可能会遇到 IDX10501
错误。这通常是由于身份验证中间件按顺序检查每个方案所致。 在许多情况下,可以安全地忽略此错误。
ASP.NET Core 6 及更高版本:
在较新的版本中,需要默认的身份验证方案。 这是一个改编后的示例:
<code class="language-csharp">builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Audience = "your-api-audience"; options.Authority = "your-identity-server-url"; // Or your default JWT issuer }) .AddJwtBearer("AzureAD", options => { options.Audience = "your-api-audience"; options.Authority = "your-azure-ad-authority"; }); builder.Services.AddAuthorization(options => { options.DefaultPolicy = new AuthorizationPolicyBuilder( JwtBearerDefaults.AuthenticationScheme, "AzureAD") .RequireAuthenticatedUser() .Build(); });</code>
请记住将 "my-firebase-project"
、"your-custom-issuer"
、"your-secret-key"
、"your-api-audience"
、"your-identity-server-url"
和 "your-azure-ad-authority"
等占位符替换为您的实际值。 考虑对生产环境使用更强大的密钥管理。 基于策略的授权可以为复杂场景提供更细粒度的控制。
以上是如何配置 ASP.NET Core 以支持多个 JWT 令牌颁发者(例如 Firebase 和自定义颁发者)?的详细内容。更多信息请关注PHP中文网其他相关文章!