2016-07-23 213 views
5

带有ASP.NET Identity 3.0的ASP.NET Core 5,我正在使用网页和apis。我正在使用OpenIddict发布JWT令牌并进行身份验证。我的代码如下这样:通过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,我正在成功授权。
+0

请不要将标签置于问题标题! http://stackoverflow.com/help/tagging – Tseng

回答

5

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

在ASOS(后面OpenIddict的ID连接服务器架构),有2个不同的内置序列化机制,以创造和保护标记:

  • 一个使用IdentityModel(库的开发微软)并产生标准令牌由第三方可验证:

身份令牌(JWT定义)使用THI始终创建您可以拨打UseJsonWebTokens()强制OpenIddict发出使用相同序列化过程的访问令牌。

您在致电AddSigningCertificate()时指定的证书总是用于签署这些令牌。

  • 使用ASP.NET的核心数据保护堆栈(也由微软公司开发)一:

这个栈完全产生并不意味着要读取或验证“专有”的标记由第三方,因为令牌格式不是标准的,并且必然依赖于对称签名和加密。

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

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

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

我该如何执行请求来验证我的证书,以确保JWT令牌没有被篡改。 什么是正确的设置,将允许我的JWT令牌的验证和授权,假设如果我没有使用JWT,我正在成功授权。

要回答这些问题,这将有助于您启用日志记录并共享您的跟踪。

+1

什么是此默认IdentityModel使用的签名密钥?如果我想使用网络农场。 – Adam

+1

签名密钥是您使用的X.509证书(更确切地说是它包含的RSA密钥) – Pinpoint

+1

钥匙圈是什么?我们如何在其中存储主密钥?这是否需要在启动期间调用'AddSigningKey()'? –