ASP.NET Core Identity - 使令牌(电子邮件确认、密码重置等)在不同服务器上有效?

Posted

技术标签:

【中文标题】ASP.NET Core Identity - 使令牌(电子邮件确认、密码重置等)在不同服务器上有效?【英文标题】:ASP.NET Core Identity - Make tokens (email confirmation, password reset, etc) valid across different servers? 【发布时间】:2020-04-11 04:14:04 【问题描述】:

我正在使用 ASP.NET Core Identity 和 IdentityServer4 创建身份验证服务。通常一切正常,但我遇到了一个问题,因为在我们的实时环境中,它托管在多台服务器上,在这种情况下,在一台服务器上生成的令牌(例如密码重置令牌)无效在另一个。

我正在像这样设置身份(自定义用户商店等在其他地方注册):

 services.AddDataProtection()
     .SetApplicationName("IdentityService");

 services.AddIdentity<ApplicationUser, ApplicationRole>(options =>
 
     options.Password.RequireNonAlphanumeric = false;
 )
     .AddDefaultTokenProviders();

如您所见,我已尝试设置应用程序名称,使其在每台服务器上都相同,但这并没有解决问题。

我发现 I can create an IXmlRepository 将用于存储 Identity 使用的密钥:

services.AddDataProtection()
     .SetApplicationName("IdentityService");
     .AddKeyManagementOptions(s => s.XmlRepository = new CustomXmlRepo());

如果我实现这一点并将密钥存储在我们的数据库中,这会解决我的问题吗?还有其他(更好的)方法吗?

【问题讨论】:

分布式内存缓存 docs.microsoft.com/en-us/aspnet/core/performance/caching/… ??? @Tseng 分布式内存缓存如何有助于 ASP.NET Core 数据保护(AddDefaultTokenProviders),或者我遗漏了什么 那我好像没看懂问题或问题。有不同的提供者,例如.AddDataProtection().PersistKeysToFileSystem.ProtectKeysWithAzureKeyVault 等。使用内存缓存的组件通常依赖IDistributedCache,其默认实现是(本地)内存缓存。通过添加 Redis,它可以自动使应用程序扩展到多个实例。两者都 - 数据保护和内存缓存 - 可以使用 asp.net 核心进行开箱即用配置,所以不确定为什么首先需要自己的实现 AddDefaultProviders 只是注册了令牌生成服务,并没有说明它的存储位置 【参考方案1】:

本文介绍了使identityserver4 实现生产就绪所需的操作 - 其中要求是共享和持久存储数据保护密钥:

IdentityServer4 指导:http://docs.identityserver.io/en/latest/topics/deployment.html

配置 ASP.NET Core 数据保护:https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview?view=aspnetcore-3.1

实现您自己的方法绝对没问题 - 只要确保它们的存储位置得到充分保护。

【讨论】:

以上是关于ASP.NET Core Identity - 使令牌(电子邮件确认、密码重置等)在不同服务器上有效?的主要内容,如果未能解决你的问题,请参考以下文章

Asp.net Core 2.0 Identity.TwoFactorRememberMe 到期

“Identity.External”的 ASP.NET Core 标识异常

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 14. ASP.NET Core Identity 入门

ASP.Net Core 如何在 EF Core 和 Identity 中获取用户角色

Asp.Net Core 2.1 Identity - UserStore 依赖注入

ASP.NET Core Identity 系列之四