如何在OpenIddict服务器中使用KeyVaultSecurityKey作为非对称签名密钥
如何在OpenIddict服务器中使用KeyVaultSecurityKey作为非对称签名密钥
我完全懂你的需求——你不想把RSA密钥从Azure Key Vault(AKV)的Secret里取出来本地使用,而是希望直接让OpenIddict请求AKV的密钥服务完成JWT签名,这样密钥始终安全留在AKV里,不会暴露到应用服务器上,这确实是更安全合规的做法。
下面我来告诉你怎么把你提供的JWT签名逻辑集成到OpenIddict服务器的配置里:
第一步:安装必要的NuGet包
首先得装几个核心包,用来支持AKV密钥操作和OpenIddict:
Microsoft.IdentityModel.KeyVaultExtensions:提供KeyVaultSecurityKey类型Azure.Identity:提供DefaultAzureCredential简化AKV身份验证- OpenIddict基础包(比如
OpenIddict.AspNetCore、OpenIddict.Server.AspNetCore)
第二步:配置OpenIddict使用AKV密钥签名
在你的应用配置文件(比如Program.cs)里,找到OpenIddict服务器的配置部分,添加以下签名凭据配置:
builder.Services.AddOpenIddict() .AddServer(options => { // 先配置你的OpenIddict基础端点(根据业务需求调整) options.UseAspNetCore() .EnableAuthorizationEndpoint("/connect/authorize") .EnableTokenEndpoint("/connect/token") .EnableLogoutEndpoint("/connect/logout"); // 核心:配置使用AKV密钥进行签名 options.AddSigningCredentials(resolver => { // 从配置文件读取AKV密钥的URI(比如https://your-vault.vault.azure.net/keys/your-key) var rsaKeyUri = builder.Configuration["RsaKeyUri"]; // 创建KeyVaultSecurityKey,指定AKV密钥地址和令牌获取逻辑 var key = new KeyVaultSecurityKey( rsaKeyUri, async (authority, resource, scope) => { // 使用DefaultAzureCredential自动处理身份验证(支持本地开发和生产托管标识) var credential = new DefaultAzureCredential(); var token = await credential.GetTokenAsync( new TokenRequestContext(new[] { $"{resource}/.default" }) ); return token.Token; } ); // 返回RS256算法的签名凭据 return new SigningCredentials(key, SecurityAlgorithms.RsaSha256); }); });
关键细节说明
- 身份验证逻辑:
DefaultAzureCredential会自动适配不同环境的身份验证方式——本地开发时用你Azure CLI、Visual Studio或Azure PowerShell的登录凭据;生产环境部署在Azure上的话,直接用应用的托管标识就行,不用硬编码任何密钥或密码。 - 密钥权限:一定要确保你的应用身份(托管标识或本地开发账户)拥有AKV密钥的
KeySign权限,不然AKV会拒绝签名请求。你可以在AKV的「访问策略」里添加这个权限。 - JWKS端点:OpenIddict会自动暴露
/.well-known/openid-configuration/jwks端点,资源服务器可以通过这个端点获取公钥验证令牌,不需要直接访问AKV,非常方便。
你之前提供的这段直接创建JWT的代码:
var token = new JwtSecurityToken( _configuration.Issuer, _configuration.Audience, claims, expires: expiration == null ? null : now.Add(expiration.Value), new SigningCredentials( new KeyVaultSecurityKey( _configuration.RsaKeyUri, async (authority, resource, scope) => { var credential = new DefaultAzureCredential(); var token = await credential.GetTokenAsync(new TokenRequestContext(new[] { resource + "/.default" })); return token.Token; } ), "RS256") {
其实就是我们配置逻辑的核心,我们只是把这个签名凭据的创建逻辑集成到了OpenIddict的服务器流程里,让它生成令牌时自动调用AKV的密钥服务。
备注:内容来源于stack exchange,提问作者Karl
相关产品推荐
相关产品推荐

