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

ASP.NET MVC会话丢失与Identity自动登出问题求助

问题分析与解决方案

首先,这两个问题本质上是域名不一致导致Cookie/Session无法共享,再加上Plesk的域名配置放大了这个问题,咱们一步步拆解:

核心原因:跨域名Cookie不共享

ASP.NET的Session Cookie和Identity认证Cookie都是和当前域名绑定的。如果用户访问的域名(比如www.jooyabash.ir)和银行回调的域名(比如jooyabash.ir)不一致,浏览器会认为是两个不同的站点,不会携带对应的Cookie,就会出现:

  • 回调时Session["orderid"]为null
  • Identity认证Cookie无法被识别,用户看似“自动登出”

Plesk域名设置的影响

你观察到的现象完全符合这个逻辑:

  • 设置为"None":网站同时接受www和不带www的请求,用户可能用其中一个访问,银行回调用了另一个,域名不统一导致Cookie丢失。
  • 设置为"www.jooyabash.ir":Plesk会把不带www的请求重定向到带www的,但如果银行回调用的是不带www的URL,就会出现域名不匹配,Cookie无法传递。
  • 设置为"jooyabash.ir":所有www的请求都会被重定向到不带www的,确保用户访问和银行回调的域名完全一致,Cookie能正常携带,所以10分钟内会话正常(超过10分钟可能是应用池回收的问题,后面说)。

具体解决方案

1. 强制统一域名(优先推荐)

在Plesk里固定Preferred domain为jooyabash.ir,确保所有请求最终都跳转到这个域名。同时,把银行回调的URL也改成jooyabash.ir/Result,彻底避免域名不一致的问题。

2. 配置Cookie跨子域名共享(备选方案)

如果必须同时支持www和不带www的域名,需要显式设置Cookie的Domain属性,让两个域名共享Cookie:

针对Session Cookie(修改web.config)

<system.web>
  <!-- 让Session Cookie支持所有子域名 -->
  <sessionState timeout="30" cookieDomain=".jooyabash.ir"></sessionState>
  <!-- 全局Cookie配置 -->
  <httpCookies domain=".jooyabash.ir" />
  <authentication mode="Forms">
    <forms loginUrl="~/User/Login" timeout="30" domain=".jooyabash.ir">
    </forms>
  </authentication>
</system.web>

针对Identity认证Cookie(修改Startup.cs)

在UseCookieAuthentication中添加CookieDomain配置:

app.UseCookieAuthentication(new CookieAuthenticationOptions() {
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new Microsoft.Owin.PathString("/User/Login"),
    ExpireTimeSpan = TimeSpan.FromDays(15),
    CookieDomain = ".jooyabash.ir", // 新增这一行,支持跨子域名
    Provider = new CookieAuthenticationProvider {
        OnApplyRedirect = ctx => {
            if (!IsForApi(ctx.Request)) {
                ctx.Response.Redirect(ctx.RedirectUri);
            }
        }
    }
});

3. 解决10分钟后会话失效的问题

当设置为jooyabash.ir时10分钟内正常,超过时间失效,大概率是Plesk应用池自动回收导致的(默认应用池回收时间可能是20分钟以内)。你可以:

  • 登录Plesk,找到对应网站的应用池,调整回收时间(比如设置为120分钟)
  • 或者禁用应用池的定期回收(不推荐,除非你有其他监控机制)
  • 如果Session重要性很高,可以考虑改用StateServer或SQLServer模式存储Session(避免应用池回收丢失Session)

额外注意点

  • 确保银行回调的请求是POST请求(如果是GET,可能会有缓存问题,但主要还是域名)
  • 检查浏览器是否禁用了Cookie,不过你设置为jooyabash.ir时正常,所以这个可以排除

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:57:32