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

ASP.NET Core 2.0部署防伪造令牌解密失败及身份验证跳转异常求助

解决ASP.NET Core 2.0部署IIS后的登录异常与跳转循环问题

兄弟,你的问题我拆解成几个核心部分,咱们一步步排查解决:

一、先搞定「CryptographicException密钥找不到」的根源

这个问题本质是ASP.NET Core DataProtection的密钥存储默认依赖本地用户上下文——你本地调试用的是自己的用户账户,而IIS应用池默认用的是ApplicationPoolIdentity或者其他内置账户,两者的密钥环目录不共享,所以部署后找不到密钥。你尝试用Redis或文件系统存储密钥的思路是对的,只是细节没处理好。

1. 为什么Redis连接失败?

你写的Redis连接字符串是192.168.10.151:80,这明显踩坑了!Redis默认端口是6379,80是Web服务的端口,肯定连不上。除此之外,还要检查这些点:

  • 测试服务器上的Redis服务是否启动?登录服务器运行redis-cli ping,返回PONG才是正常运行状态。
  • 服务器防火墙是否开放6379端口?或者是否允许你的应用服务器IP访问Redis端口?
  • 如果Redis设置了密码,连接字符串要加上密码参数,比如:192.168.10.151:6379,password=YourRedisPasswd
  • 优化Redis连接代码,增加容错:
var redisConfig = new ConfigurationOptions
{
    EndPoints = { "192.168.10.151:6379" },
    ConnectTimeout = 5000,
    SyncTimeout = 5000,
    AbortOnConnectFail = false // 避免连接失败直接崩溃应用
};
var redis = ConnectionMultiplexer.Connect(redisConfig);
services.AddDataProtection().PersistKeysToRedis(redis, "DataProtection-Keys");

2. 改用文件系统后跳转循环的原因排查

你配置了PersistKeysToFileSystem但出现登录后跳转回登录页的循环,核心是身份验证状态没有被正确识别,大概率是这几个原因:

(1)密钥目录权限不足

c:\ProgramData\dpkeys目录默认只有管理员权限,而IIS应用池的身份(比如ApplicationPoolIdentity)没有读写权限,导致DataProtection无法生成/读取密钥,进而导致身份验证Cookie无法被正确解密,服务器识别不到你已经登录。

解决步骤:

  • 右键c:\ProgramData\dpkeys → 属性 → 安全 → 编辑 → 添加
  • 在「输入对象名称来选择」中输入IIS AppPool\[你的应用池名称](比如IIS AppPool\MyAppPortal),点击检查名称确认
  • 给这个账户分配读取、写入、修改权限,保存后重启应用池

(2)测试服务器缺少ASP.NET Core 2.0 Runtime

你怀疑的“缺少SDK”其实不准确——部署只需要Runtime,SDK是开发用的。检查步骤:

  • 打开测试服务器的「控制面板 → 程序和功能」,搜索「Microsoft ASP.NET Core 2.0 Runtime」
  • 如果没有,去微软官网下载对应版本的Runtime(注意区分x86/x64,和服务器系统匹配),安装后重启IIS

(3)中间件顺序错误

ASP.NET Core的中间件顺序非常关键,UseAuthentication()必须在UseMvc()之前调用,否则路由会先执行,认证逻辑没生效就会被拦截。正确的Configure方法顺序应该是:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseAuthentication(); // 必须在UseMvc之前!
    app.UseAuthorization();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

(4)身份验证Cookie配置问题

可以显式配置Cookie的参数,确保在服务器环境下能正常传递:

services.ConfigureApplicationCookie(options =>
{
    options.Cookie.HttpOnly = true;
    options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
    options.LoginPath = "/Account/Login";
    options.AccessDeniedPath = "/Account/AccessDenied";
    options.SlidingExpiration = true;
    options.Cookie.SameSite = SameSiteMode.Lax; // 同服务器访问用Lax足够
    // 如果是域名访问,可设置options.Cookie.Domain = "yourdomain.com";
});

(5)查看详细日志定位问题

如果以上都没解决,建议开启详细日志:

  • 在Startup的ConfigureServices中添加日志配置:
services.AddLogging(builder =>
{
    builder.AddConsole();
    builder.AddDebug();
    builder.AddEventLog(); // 写入Windows事件查看器
});
  • 查看IIS的「事件查看器 → 应用程序日志」,里面会有身份验证失败、DataProtection密钥加载失败的具体错误信息,帮你精准定位。

内容的提问来源于stack exchange,提问作者Aldemar Cuartas Carvajal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:56:14