首页 文章

通过JWT Token授权

提问于
浏览
5

使用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 回答

  • 5

    如果我禁用UseJsonWebTokens(),我可以生成令牌并成功授权 . 但是,我不确定我的证书是否验证了返回的令牌 .

    在ASOS(OpenIddict背后的OpenID Connect服务器框架)中,有2种不同的内置序列化机制来创建和保护令牌:

    • One that uses IdentityModel (由Microsoft开发的库)并生成 standard tokens verifiable by third parties

    始终使用此过程创建标识令牌(根据定义为JWT),您可以调用 UseJsonWebTokens() 强制OpenIddict发出使用相同序列化过程的访问令牌 .

    调用 AddSigningCertificate() 时指定的证书始终用于对这些令牌进行签名 .

    • One that uses the ASP.NET Core Data Protection stack (也是由微软开发的):

    此堆栈专门生成 "proprietary" tokens that are not meant to be read or verified by a third-party ,因为令牌格式不是标准格式,必然依赖于对称签名和加密 .

    这是我们用于授权代码和刷新令牌的机制,仅供OpenIddict本身使用 . 当您使用默认令牌格式时,它也用于访问令牌 .

    在这种情况下,不使用您在调用 AddSigningCertificate() 时指定的证书 .

    相反,这些令牌始终由数据保护堆栈使用 Authenticated Encryption 算法(默认情况下,AES-256-CBC和HMACSHA256)加密,提供真实性,完整性和机密性 . 为此,数据保护堆栈从存储在密钥环中的一个主密钥导出2个密钥(一个用于加密,一个用于验证) .

    如何强制使用我的证书验证请求,以确保JWT令牌未被篡改 . 什么是允许验证和授权我的JWT令牌的正确设置,因为如果我不使用JWT,我将获得成功授权 .

    要回答这些问题,如果您启用了日志记录并共享了跟踪,这将有所帮助 .

相关问题