身份服务器中的签名算法

问题描述 投票:0回答:1

我正在使用 Duende Identity Server,我想为特定 API 资源的访问令牌指定签名算法。默认情况下,Duende Identity Server 使用 RSA 256 对访问令牌进行签名。但是,我不确定如何为访问令牌设置特定算法。

此外,我注意到一个名为“Key”的表,但我不完全理解它在 Duende Identity Server 上下文中的用途和实用性。您能否提供有关“Key”表的更多信息或说明?

c# .net cryptography authorization identityserver4
1个回答
0
投票

(我只熟悉 IdentityServer4,我还没有将自己的组织更新到 IdentityServer6,所以如果您使用更高版本,请务必根据您的 IS 程序集验证我的答案,也许使用 ILSpy)。

我正在使用 Duende Identity Server,我想为特定 API 资源的

access_token
指定签名算法。默认情况下,Duende Identity Server 使用
RSA256
来签署访问令牌。但是,我不确定如何为访问令牌设置特定算法。

  • 在使用

    RSA256
    的替代算法(例如
    ES256
    )之前,您需要确保您的IdentityServer具有适合您要使用的新算法的证书和私钥。

    • 您可以通过使用 IIdentityServerBuilder 方法,在
      Startup
      期间将您的证书(或其他
      密钥材料
      )添加到
      IdentityServerBuilderExtensionsCrypto.AddSigningCredential
      来完成此操作;您可能还需要显式指定一个
      IdentityServer4.IdentityServerConstants.$algorithm
      枚举值。
  • 一旦您拥有可用的

    SigningCredential
    ,请更新您的
    IResourceStore
    ApiResource
    对象,以便
    ApiResource.AllowedAccessTokenSigningAlgorithms
    包含新算法。

  • 您的 RP 需要专门支持您指定的算法;这不应该影响任何客户端(除非RP本身也是客户端),因为客户端应该将

    access_token
    值视为不透明字符串并且从不检查它们(例如使用JWT库);如果客户想要查看声明值,他们应该使用
    id_token
    ,这将使用不同的签名算法(在 IS4 的
    Client.AllowedIdentityTokenSigningAlgorithms
    中指定)。


例如,如果你想使用 ES256 那么你会需要这样的东西:

您的 IdentityServer 的 Startup.cs

IIdentityServerBuilder idSrvBuilder = services.AddIdentityServer( ... );

X509Certificate2 yourRsaCertificate = ...
X509Certificate2 yourEcdsaCertificate = ...

// Add the standard/basic/traditional RS256 cert:
_ = idSrvBuilder.AddSigningCredential( certificate: yourRsaCertificate, signingAlgorithm: "RS256" );

// Add ES256 as an alternative for services that support it:
ECDsaSecurityKey eccKey = new ECDsaSecurityKey( eccPrivate )
{
    KeyId = "<your key-id here>"
};

_ = idSrvBuilder.AddSigningCredential( eccKey, IdentityServer4.IdentityServerConstants.ECDsaSigningAlgorithm.ES256 );

您的 IdentityServer 资源存储:

(此代码假设您正在使用内存中不可变的

ApiResource
对象)

private static readonly ApiResource _myFirstApiResourceUsingRsa256 = new ApiResource()
{
    // etc
};

private static readonly ApiResource _myOtherApiResourceUsingES256 = new ApiResource()
{
    AllowedAccessTokenSigningAlgorithms = { "ES256" },
    // etc
};

您的 RP 可能需要特殊配置才能工作(除了确保您的 RP 的 JWT 处理中间件实际上支持 ES256);但据我的经验,它应该可以正常工作,因为 RP 会自动直接从 IdentityServer IdP 获取 ES256 密钥的公共部分(假设 RP 可以直接联系 IdP)。

我想重申一个重要的细节,即这一切都假设客户(不是 RP 本身)不会尝试自行检查

access_token

,例如验证令牌或提取声明 - 否则更改签名算法可能会破坏客户端(如果您想
惩罚一个不使用id_token
的坏客户端,这可能是可取的)。


此外,我注意到一个名为“Key”的表,但我不完全理解它在 Duende Identity Server 上下文中的用途和实用性。您能否提供有关“Key”表的更多信息或说明?

    如果您使用
  • Key
     包来处理数据库,您只会看到 
    Keys
    (或 
    Duende.IdentityServer.EntityFramework.Storage
    )表。
    
      不需要使用 EF/数据库存储来存储密钥(例如我自己的项目经常使用 Azure Key Vault 或本地文件系统)。
  • 该表由
  • Duende.IdentityServer.EntityFramework.Stores.SigningKeyStore
     用于存储密钥和证书。
    
      因此,如果您的项目使用数据库来存储密钥和证书,请确保
    • Keys
       表包含您要使用的算法的有效密钥/证书。
© www.soinside.com 2019 - 2024. All rights reserved.