使用ASP.NET Identity 3.0的ASP.NET Core 5,我正在使用网页和apis . 我正在使用OpenIddict发出JWT令牌并进行身份验证 . 我的代码看起来像这样:
X509Certificate2 c = new X509Certificate2(@"tokensign.p12", "MyCertificatePassword");
services.AddOpenIddict<WebUser, IdentityRole<int>, WebDbContext, int>()
.EnableTokenEndpoint("/api/customauth/login")
.AllowPasswordFlow()
.UseJsonWebTokens()
.AddSigningCertificate(c);
如果我禁用UseJsonWebTokens(),我可以生成一个令牌并成功授权 . 但是,我不确定我的证书是否验证了返回的令牌 .
当启用UseJsonWebTokens时,我能够在此终点发出JWT令牌 . 但是,我无法验证任何请求!
我在应用程序配置中使用以下代码:
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
RequireHttpsMetadata = false,
Authority = "http://localhost:60000/",
Audience = "http://localhost:60000/",
});
app.UseOAuthValidation();
app.UseIdentity();
app.UseOpenIddict();
app.UseMvcWithDefaultRoute();
-
如何强制使用我的证书验证请求,以确保JWT令牌未被篡改 .
-
允许验证和授权我的JWT令牌的正确设置是什么,因为如果我不使用JWT,我将获得成功授权 .
1 回答
在ASOS(OpenIddict背后的OpenID Connect服务器框架)中,有2种不同的内置序列化机制来创建和保护令牌:
始终使用此过程创建标识令牌(根据定义为JWT),您可以调用
UseJsonWebTokens()
强制OpenIddict发出使用相同序列化过程的访问令牌 .调用
AddSigningCertificate()
时指定的证书始终用于对这些令牌进行签名 .此堆栈专门生成 "proprietary" tokens that are not meant to be read or verified by a third-party ,因为令牌格式不是标准格式,必然依赖于对称签名和加密 .
这是我们用于授权代码和刷新令牌的机制,仅供OpenIddict本身使用 . 当您使用默认令牌格式时,它也用于访问令牌 .
在这种情况下,不使用您在调用
AddSigningCertificate()
时指定的证书 .相反,这些令牌始终由数据保护堆栈使用
Authenticated Encryption
算法(默认情况下,AES-256-CBC和HMACSHA256)加密,提供真实性,完整性和机密性 . 为此,数据保护堆栈从存储在密钥环中的一个主密钥导出2个密钥(一个用于加密,一个用于验证) .要回答这些问题,如果您启用了日志记录并共享了跟踪,这将有所帮助 .