我正在使用 Duende Identity Server,我想为特定 API 资源的访问令牌指定签名算法。默认情况下,Duende Identity Server 使用 RSA 256 对访问令牌进行签名。但是,我不确定如何为访问令牌设置特定算法。
此外,我注意到一个名为“Key”的表,但我不完全理解它在 Duende Identity Server 上下文中的用途和实用性。您能否提供有关“Key”表的更多信息或说明?
(我只熟悉 IdentityServer4,我还没有将自己的组织更新到 IdentityServer6,所以如果您使用更高版本,请务必根据您的 IS 程序集验证我的答案,也许使用 ILSpy)。
我正在使用 Duende Identity Server,我想为特定 API 资源的
指定签名算法。默认情况下,Duende Identity Server 使用access_token
来签署访问令牌。但是,我不确定如何为访问令牌设置特定算法。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
)表。
Duende.IdentityServer.EntityFramework.Stores.SigningKeyStore
用于存储密钥和证书。
Keys
表包含您要使用的算法的有效密钥/证书。