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

为何ASP.NET Identity跨实例无法验证密码重置令牌?

问题分析与解决方案

为什么默认不支持负载均衡环境?

在.NET 4.7.2的ASP.NET Identity中,默认的数据保护机制会为每个应用实例自动生成本地加密密钥,这些密钥存储在实例本地的%LOCALAPPDATA%\ASP.NET\DataProtection-Keys目录下。由于多实例之间的密钥完全独立,生成重置令牌时用的是当前实例的本地密钥,其他实例没有这个密钥,自然无法解密验证令牌,就出现了“令牌与生成实例绑定”的问题。

你之前误以为默认用机器密钥来保证一致性,这是混淆了旧的Forms认证机制——ASP.NET Identity 2及以上版本默认使用Data Protection API (DPAPI),而非传统的机器密钥,所以共享机器密钥对Identity的令牌加密完全不起作用。

无需自定义加密逻辑的解决方案

要解决这个问题,核心是让所有实例共享同一套加密密钥,只需做以下配置:

1. 配置共享密钥存储位置

将Data Protection的密钥存储到所有实例都能访问的共享位置(比如网络共享文件夹、云存储),示例代码(在Owin Startup类中):

using Microsoft.AspNetCore.DataProtection;
using System.IO;

public void Configuration(IAppBuilder app)
{
    // 指定共享密钥存储目录(替换为你的实际共享路径)
    var sharedKeyDir = new DirectoryInfo(@"\\your-shared-server\aspnet-data-protection-keys");
    // 创建共享的DataProtectionProvider并设置统一应用名
    var dataProtectionProvider = DataProtectionProvider.Create(sharedKeyDir)
        .SetApplicationName("YourUniqueAppName");
    // 将该提供程序注入到Owin上下文
    app.UseDataProtectionProvider(dataProtectionProvider);
}

注意:必须确保所有应用实例对这个共享目录有读写权限,否则密钥无法生成或读取。

2. 确保Identity使用共享的DataProtectionProvider

在UserManager的创建逻辑中,指定使用共享的DataProtector来生成令牌:

public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
    var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
    
    // 获取共享的DataProtectionProvider
    var dataProtectionProvider = context.GetDataProtectionProvider();
    if (dataProtectionProvider != null)
    {
        // 配置令牌生成器使用共享密钥
        manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(
            dataProtectionProvider.Create("ASP.NET Identity"));
    }
    
    // 其他UserManager配置...
    return manager;
}

为什么之前SetApplicationName无效?

单独设置SetApplicationName只能保证不同应用之间的密钥隔离,但每个实例依然会生成自己的本地密钥。只有结合共享密钥存储,才能让所有实例共用同一套密钥,彻底解决令牌绑定实例的问题。

内容的提问来源于stack exchange,提问作者Tom Troughton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:20:45