我在我们所有的环境(开发、测试、生产(中都使用Identity Server 4(.Net Core 2.2(,我们的启动如下
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddAspNetIdentity<ApplicationUser>()
.AddInMemoryClients(Configuration.GetSection("IdentityServer:Clients"))
.AddConfigurationStore(Configuration.GetSection("CosmosDB"))
.AddOperationalStore(Configuration.GetSection("CosmosDB"))
.AddProfileService<ProfileService>();
- 这使用在调试/开发环境(tempkey.RSA(中生成的临时RSA密钥文件
这目前正在运行-用户已通过身份验证并处理索赔
我意识到,在本地/开发之外的任何其他环境中都不建议这样做,但我们即将从ADFS-3迁移到ADFS-4,这将改变架构,因此我们将不再需要上述代码(也可能不需要我们的Identity Server 4实例(
我也意识到的解决方案存在局限性
- 单个/多个实例(如果是这种情况,则同一RSA密钥需要在多个实例之间同步(
- 还有一个问题是tempkey.rsa在互联网上的可见性-它所在的文件夹不能通过互联网提供服务
但是,我有一些问题,如果ADFS端的证书被更新(可能在我们迁移之前发生(,会发生什么?如果发生这种情况,
- 现有用户JWT会失效吗
- 我看不到任何地方有旧的(或可能是新的(ADFS证书的指纹——它应该在哪里注册吗
- 据我所知,RSA密钥不会过期,对吗
您永远不应该在生产中使用AddDeveloperSigningCredential,因为在重新部署时(取决于您的设置(可能会丢失密钥,如果发生这种情况,则会生成新的签名密钥。这反过来意味着所有已经发行的代币都将失效。
更好的方法是使用AddSigningCredential方法并将密钥存储在IdentityServer之外。
当您进行密钥轮换时,您可以保留旧密钥以验证已发行的令牌,然后使用AddValidationKey添加重新分配的旧签名密钥。
参见https://docs.duendesoftware.com/identityserver/v5/fundamentals/keys/
是的,RSA签名密钥没有任何过期时间,但是,有时您会将RSA密钥封装并传输到证书中,然后添加日期/时间组件。