从另一个使用它的 C# ASP.NET Core 3.1 API 验证 JWT

Validate a JWT from another C# ASP.NET Core 3.1 API that consumes it

因此,我从服务 A 的 Web 调用中获取 JWT,以使用相同的令牌保护服务 B。不幸的是,它使用第三方库,所以我不知道它发出的确切密钥,但我可以看到它的有效负载很好。有没有办法让我的服务以某种方式知道令牌没问题?我在 Startup.ConfigureServices

中试过了
services.AddAuthentication()
            .AddJwtBearer(options =>
            {
                options.Events = new JwtBearerEvents
                {
                    OnMessageReceived = context =>
                    {
                        var accessToken = context.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ")?.Last() ?? string.Empty;
                        if (!string.IsNullOrEmpty(accessToken))
                            context.Token = accessToken;

                        return Task.CompletedTask;
                    }
                };
            });

现在这得到了我期望的 JWT,在测试用例中,我们这样说: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0Lm=[vbSJ9].[vbSJ9].

这里没有问题,'context.Token' 正在设置,但是当我这样做时:

[Authorize(AuthenticationSchemes = "Bearer")]
[Route("[controller]/[action]")]
public class JobsUpdateController : ControllerBase

使用“[Authorize(AuthenticationSchemes="Bearer")]”时,无论如何我都会收到 401。无论如何我可以做一个自定义授权吗?否则我正在考虑做一些很长的形式来设置我自己的身份验证方法,并可能制作一个自定义属性。但我希望如果我知道 'issuer' 和我期望的有效负载中的其他几个键,我可以让启动为此工作。

您可以在 options.TokenValidationParameters 中配置 JWT 验证。

这是安全的,您基本上允许使用几乎所有令牌。但无论如何,这里是:

services
    .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(
        options => {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = true, // `iss` claim
                ValidIssuers = new []{"https://localhost:1234"},
                ValidateAudience = false, // `aud` claim
                ValidateLifetime = false, // `exp`, `nbf` claims
                ValidateIssuerSigningKey = false, // signature
                SignatureValidator = (token, parameters) => new JwtSecurityToken(token), // don't validate signature
            };
        });