You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 09:33:18