在Asp.Net Core Web Api中验证B2C JWT令牌

Bil*_*oel 5 azure-ad-b2c asp.net-core

我正在使用B2C保护Asp.Net Core中的WebApi。我的代码如下。我需要验证令牌还是中间件为我做令牌?我认为,如果每个人都必须这样做,对我来说找到一些示例代码会更容易,但是我似乎对此没有任何真正的方向。

但是,此B2C文档指出我的api进行了验证。

我找到了一个示例,但不是针对Core的,他们正在使用CertificateValidator = X509CertificateValidator.None。那不是目的吗?而另一位在这里样品,他们正在这样做。

我不是必须要拥有B2C的签名密钥吗?

我可以从中总结出一个解决方案,但是我真的需要这样做吗?

提前致谢。

        app.UseJwtBearerAuthentication(new JwtBearerOptions()
        {
            AuthenticationScheme = Constants.B2CAuthenticationSchemeName,
            AutomaticAuthenticate = false,
            MetadataAddress = string.Format(
                _identityConfig.B2CInfo.AadInstance,
                _identityConfig.B2CInfo.Tenant,
                _identityConfig.B2CInfo.Policies
                    .Where(p => p.IsDefaultSignUpSignInPolicy == true)
                    .First()
                    .Name),
            Audience = _identityConfig.B2CInfo.ClientId,
            TokenValidationParameters = new TokenValidationParameters
            {
                ValidateLifetime = true,
                RequireExpirationTime = true,
                RequireSignedTokens = true,
            },
            Events = new JwtBearerEvents
            {
                OnAuthenticationFailed = B2CAuthenticationFailed
            }
        });
Run Code Online (Sandbox Code Playgroud)

Kév*_*let 5

我需要验证令牌还是中间件为我做令牌?

JWT承载中间件为您做到了(默认情况下,它将自动拒绝未签名或伪造的令牌,因此您无需显式设置RequireSignedTokenstrue)。

那不是目的吗?

使用嵌入在证书中的公共非对称密钥(例如RSA或ECDSA)来验证签名与验证证书本身(尤其是其证书链)之间是有区别的。ASP.NET Core完全支持签名验证,但是尚不支持证书验证。

我不是必须要拥有B2C的签名密钥吗?

JWT承载中间件会自动从B2C的发现端点中检索它,因此无需手动进行。有关更多信息,请随时阅读OIDC发现规范:https ://openid.net/specs/openid-connect-discovery-1_0.html