Security.Jwt

Security.Jwt

实现JWT密钥的自动生成与轮换管理

NetDevPack.Security.Jwt是专为.NET设计的JWT密钥管理组件。它能自动创建和轮换RSA或ECDsa密钥,支持JWE,提供公共jwks_uri端点,并扩展客户端API以使用JWKS端点。该组件遵循NIST最佳实践,每90天轮换密钥并移除旧私钥,采用RFC 7518推荐的RSA和ECDSA设置。通过简化JWT密钥管理流程,它显著提升了应用安全性,尤其适合负载均衡环境。

JWT密钥管理安全性API认证IdentityServer4Github开源项目

.NET的JWT密钥管理 - 为您的Jwt(jws) / Jwe生成和自动轮换加密密钥

密钥管理最大的问题之一是:如何安全地分发密钥。HMAC依赖于在多个项目之间共享密钥。为了实现这一点,NetDevPack.Security.Jwt使用公钥加密系统来生成您的密钥。因此您可以在https://<your_api_adrress>/jwks共享您的公钥!

<p align="center"> <img alt="read before" src="https://yellow-cdn.veclightyear.com/2b54e442/de951652-7cb4-4a4e-8fe0-686412036a76.png" /> </p>

您是这样创建Jwt的吗?

<p align="center"> <img alt="read before" src="https://yellow-cdn.veclightyear.com/2b54e442/c01a4c3c-f201-4a4b-9ffb-4fcc8f23ecc1.png" /> </p>

让我告诉您:您有一个问题。


<br>

NugetcoverageNetDevPack - MASTER Publish

该项目的目标是通过管理您的JWT来帮助提高应用程序的安全性。

  • 自动创建RSA或ECDsa密钥
  • 支持JWE
  • 支持公共jwks_uri端点,以JWKS格式提供您的公钥
  • 为您的客户端API提供扩展以使用JWKS端点。详见NetDevack.Security.JwtExtensions
  • 每90天自动轮换密钥(遵循NIST公钥轮换最佳实践)
  • 密钥轮换后删除旧的私钥(NIST建议)
  • 使用RSA和ECDSA的推荐设置(RFC 7518建议)
  • 使用随机数生成器为带AES CBC的JWE生成密钥(dotnet不支持带Aes128GCM的RSA-OAEP)
  • 默认将密钥保存在与ASP.NET DataProtection相同的位置(ASP.NET保存用于加密MVC cookie的密钥的同一位置)

它使用RSA和ECDsa算法生成更好的密钥。这是RFC 7518最推荐的。

令牌验证

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = "https://www.devstore.academy", ValidAudience = "NetDevPack.Security.Jwt.AspNet" }; }); builder.Services.AddAuthorization(); builder.Services.AddJwksManager().UseJwtValidation();

生成令牌:

public AuthController(IJwtService jwtService) { _jwtService = jwtService; } private string GenerateToken(User user) { var key = _jwtService.GetCurrentSigningCredentials(); // (ECDsa或RSA)自动生成的密钥 var handler = new JsonWebTokenHandler(); var now = DateTime.Now; var descriptor = new SecurityTokenDescriptor { Issuer = "https://www.devstore.academy", // <- 您的网站 Audience = "NetDevPack.Security.Jwt.AspNet", IssuedAt = now, NotBefore = now, Expires = now.AddMinutes(60), Subject = new ClaimsIdentity(FakeClaims.GenerateClaim().Generate(5)), SigningCredentials = await service.GetCurrentSigningCredentials() }; return tokenHandler.WriteToken(token); }
<p align="center"> <img width="100px" src="https://jpproject.blob.core.windows.net/images/helldog-site.png" /> </p>

目录


🛡️ 这是什么

JSON Web密钥集(JWKS)是用于验证授权服务器颁发的JSON Web令牌(JWT)的公钥集合。该组件的主要目标是为您的JWKS提供集中存储和密钥轮换,同时遵循JWKS生成的最佳实践。它具有IdentityServer4插件,可以每90天自动轮换jwks_uri,并无缝管理您的jwks_uri。

如果您的API或OAuth 2.0部署在Kubernetes或Docker Swarm的负载均衡器下,则此组件至关重要。它的功能类似于ASP.NET Core中的DataProtection Key。

该组件生成、存储和管理您的JWKS,同时维护跨实例可访问的集中存储。默认情况下,每三个月生成一个新密钥。

您可以通过JWKS端点公开您的JWKS并与您的API共享。

ℹ️ 安装

要在您的API中安装NetDevPack.Security.Jwt,请在NuGet包管理器控制台中使用以下命令:

Install-Package NetDevPack.Security.Jwt

或者,您可以使用.NET Core命令行界面:

dotnet add package NetDevPack.Security.Jwt

接下来,修改Startup.csprogram.cs文件中的Configure方法:

builder.Services.AddJwksManager().UseJwtValidation();

❤️ 令牌生成

在大多数情况下,当我们说JWT时,实际上是指JWS。

public AuthController(IJwtService jwtService) { _jwtService = jwtService; } private string GenerateToken(User user) { var tokenHandler = new JwtSecurityTokenHandler(); var currentIssuer = $"{ControllerContext.HttpContext.Request.Scheme}://{ControllerContext.HttpContext.Request.Host}"; var key = _jwtService.GetCurrentSigningCredentials(); // (ECDsa或RSA)自动生成的密钥 var token = tokenHandler.CreateToken(new SecurityTokenDescriptor { Issuer = currentIssuer, Subject = identityClaims, Expires = DateTime.UtcNow.AddHours(1), SigningCredentials = key }); return tokenHandler.WriteToken(token); }

✔️ 令牌验证 (JWS)

使用相同的服务获取当前密钥并验证令牌。

public AuthController(IJwtService jwtService) { _jwtService = jwtService; } private string ValidateToken(string jwt) { var handler = new JsonWebTokenHandler(); var currentIssuer = $"{ControllerContext.HttpContext.Request.Scheme}://{ControllerContext.HttpContext.Request.Host}"; var result = handler.ValidateToken(jwt, new TokenValidationParameters { ValidIssuer = currentIssuer, SigningCredentials = _jwtService.GetCurrentSigningCredentials() }); result.IsValid.Should().BeTrue(); }

⛅ 多个API - 使用Jwks

密钥管理的一个主要挑战是安全地分发密钥。HMAC依赖于在多个项目之间共享密钥。为解决这个问题,NetDevPack.Security.Jwt使用公钥密码系统来生成密钥。因此,您可以在https://<your_api_address>/jwks共享您的公钥!

简单明了 🎂

身份API(发出令牌的API)

在发出JWT令牌的API中安装NetDevPack.Security.Jwt.AspNetCore。修改您的Startup.cs:

public void Configure(IApplicationBuilder app) { app.UseJwksDiscovery().UseJwtValidation(); }

生成令牌:

private string EncodeToken(ClaimsIdentity identityClaims) { var tokenHandler = new JwtSecurityTokenHandler(); var currentIssuer = $"{ControllerContext.HttpContext.Request.Scheme}://{ControllerContext.HttpContext.Request.Host}"; var key = _jwksService.GetCurrentSigningCredentials(); var token = tokenHandler.CreateToken(new SecurityTokenDescriptor { Issuer = currentIssuer, Subject = identityClaims, Expires = DateTime.UtcNow.AddHours(1), SigningCredentials = key }); return tokenHandler.WriteToken(token); }

客户端API

在需要JWT验证的客户端API中,安装NetDevPack.Security.JwtExtensions。然后,更新您的Startup.cs:

public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(x => { x.RequireHttpsMetadata = true; x.SaveToken = true; // 将公钥保存在缓存中10分钟。 x.IncludeErrorDetails = true; // <- 便于调试 x.SetJwksOptions(new JwkOptions("https://localhost:5001/jwks")); }); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // ... app.UseAuthentication(); app.UseAuthorization(); // ... }

在你的Controller中:

[Authorize] public class IdentityController : ControllerBase { public IActionResult Get() { return new JsonResult(from c in User.Claims select new { c.Type, c.Value }); } }

完成 👌!

💾 存储

默认情况下,NetDevPack.Security.Jwt将密钥存储在与ASP.NET Core存储其加密密钥材料相同的位置。它使用IXmlRepository

对DataProtection所做的任何更改也将适用于此。

你可以通过添加另一个提供程序并根据需要进行自定义来覆盖默认行为。

数据库

NetDevPack.Security.Jwt包提供了一种使用EntityFramework Core在数据库中存储密钥的方法。

通过NuGet包管理器安装:

    Install-Package NetDevPack.Security.Jwt.Store.EntityFrameworkCore

或通过.NET Core命令行界面:

    dotnet add package NetDevPack.Security.Jwt.Store.EntityFrameworkCore

ISecurityKeyContext添加到你的DbContext:

class MyKeysContext : DbContext, ISecurityKeyContext { public MyKeysContext(DbContextOptions<MyKeysContext> options) : base(options) { } // 这映射到存储密钥的表。 public DbSet<SecurityKeyWithPrivate> DataProtectionKeys { get; set; } }

然后在Startup.cs中更改你的配置

public void ConfigureServices(IServiceCollection services) { services.AddJwksManager().PersistKeysToDatabaseStore<MyKeysContext>(); }

完成!

文件系统

NetDevPack.Security.Jwt包提供了一种将密钥存储到文件系统的机制。

安装

    Install-Package NetDevPack.Security.Jwt.Store.FileSystem

或通过.NET Core命令行界面:

    dotnet add package NetDevPack.Security.Jwt.Store.FileSystem

现在更改你的startup.cs

public void ConfigureServices(IServiceCollection services) { services.AddJwksManager().PersistKeysToFileSystem(new DirectoryInfo(@"c:\temp-keys\")); }

示例

你可以在这里找到几个示例

更改算法

可以在配置过程中修改默认算法。

build.Services.AddJwksManager(o => { o.Jws = Algorithm.Create(DigitalSignaturesAlgorithm.RsaSsaPssSha256); o.Jwe = Algorithm.Create(EncryptionAlgorithmKey.RsaOAEP).WithContentEncryption(EncryptionAlgorithmContent.Aes128CbcHmacSha256); });

默认情况下,它使用根据RFC7518推荐的算法

build.Services.AddJwksManager(o => { o.Jws { get; set; } = Algorithm.Create(AlgorithmType.RSA, JwtType.Jws); o.Jwe { get; set; } = Algorithm.Create(AlgorithmType.RSA, JwtType.Jwe); }

Algorithm对象提供了多种选择。

Jws

算法:

简称名称
HS256Hmac Sha256
HS384Hmac Sha384
HS512Hmac Sha512
RS256Rsa Sha256
RS384Rsa Sha384
RS512Rsa Sha512
PS256Rsa SsaPss Sha256
PS384Rsa SsaPss Sha384
PS512Rsa SsaPss Sha512
ES256Ecdsa Sha256
ES384Ecdsa Sha384
ES512Ecdsa Sha512

Jwe

算法选项:

简称密钥管理算法
RSA1_5RSA1_5
RsaOAEPRSAES OAEP using
A128KWA128KW
A256KWA256KW

加密选项

简称内容加密算法
Aes128CbcHmacSha256A128CBC-HS256
Aes192CbcHmacSha384A192CBC-HS384
Aes256CbcHmacSha512A256CBC-HS512

IdentityServer4 - 自动jwks_uri管理

NetDevPack.Security.Jwt提供IdentityServer4密钥材料。它自动生成和轮换密钥。

首先安装

    Install-Package NetDevPack.Security.Jwt.IdentityServer4

或通过.NET Core命令行界面:

    dotnet add package NetDevPack.Security.Jwt.IdentityServer4

转到Startup.cs

public void ConfigureServices(IServiceCollection services) { var builder = services.AddIdentityServer() .AddInMemoryIdentityResources(Config.GetIdentityResources()) .AddInMemoryApiResources(Config.GetApis()) .AddInMemoryClients(Config.GetClients()); services.AddJwksManager().IdentityServer4AutoJwksManager(); }

如果你想使用数据库,请按照DatabaseStore的说明进行操作。

为什么

在使用OAuth 2.0或简单地签署JWT密钥开发应用程序和API时,支持各种算法。在这些算法中,一些被认为是最佳实践并优于其他算法,例如带有PS256算法的椭圆曲线。某些Auth服务器使用确定性算法运行,而其他服务器使用概率性算法。一些服务器,如Auth0,不支持多个JWK,但IdentityServer4支持你配置的任意数量。该组件旨在抽象这一层并为你的应用程序提供当前JWK管理的最佳实践。

负载均衡场景

在Kubernetes或Docker Swarm中使用容器时,扩展应用程序可能会导致某些问题,例如需要将DataProtection密钥存储在集中位置。虽然不建议绕过这种情况,但使用对称密钥是一种可能的解决方案。与DataProtection类似,该组件为你的JWKS提供了集中存储。

最佳实践

许多开发人员不确定应该使用哪种算法来签署他们的JWT。默认情况下,该组件使用带有ECDSA的椭圆曲线,利用P-256和SHA-256来帮助构建更安全的API和环境。它通过提供对最佳实践的更好理解并确保使用安全算法来简化JWKS管理。


许可证

NetDevPack.Security.Jwt是开源软件,根据MIT许可证发布。该许可证允许在自由和商业应用程序及库中无限制地使用NetDevPack.Security.Jwt。

编辑推荐精选

蛙蛙写作

蛙蛙写作

AI小说写作助手,一站式润色、改写、扩写

蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。

AI辅助写作AI工具蛙蛙写作AI写作工具学术助手办公助手营销助手AI助手
Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

下拉加载更多