0

我有一个asp.net MVC 3.0网站托管在主网站的子域上。Asp.net版本设置为.Net 4.0 integrated pipeLine.

表单身份验证设置如下:

<authentication mode="Forms">
  <forms
          cookieless="UseCookies"
          defaultUrl="~/home"
          enableCrossAppRedirects="false"
          path="/"
          requireSSL="false"
          loginUrl="~/account/login"
          protection="All"
          timeout="120"
          slidingExpiration="true"
          name=".SubDomainAuthCookie"></forms>
</authentication>

但每次几分钟后它就会让退出!主机管理员说这可能由于编码不当繁重的任务导致应用程序池重置,但它是一个简单的 mvc网站,带有EF ORM。我不知道该怎么办!我应该寻找这种情况的可能原因是什么?

更新 :

检查后Application_Start,我发现是问题所在,我登录Application_Start()了,结果是每当我被注销时,都会添加一个日志。

12/6/2012 12:14:03 PM ==> Application started
12/6/2012 12:16:35 PM ==> Application started
12/6/2012 12:22:59 PM ==> Application started

奇怪,但真实。逻辑上没有什么复杂或沉重的!EF 可能是问题所在,它是否会消耗大量内存/CPU 导致应用程序池重置?

4

4 回答 4

3
  • 检查没有其他应用程序使用 name=".SubDomainAuthCookie"。这些应用程序可以覆盖它们的 cookie。
  • 您在登录页面FormsAuthentication.SetAuthCookie调用之前使用吗?FormsAuthentication.RedirectFromLoginPage如果不是,则可能是身份验证 cookie 设置不正确。
  • 尝试记录 global.asax.cs 的 Application_End 以了解您的应用程序是否回收过多。

    protected void Application_End(object sender, EventArgs e) { /记录 Application_End / }

    正如@ZippyV 在下面的一个答案中所提到的,这背后的原因是 IIS 默认设置为在每个名为 MachineKey 的 AppPool 回收中自动生成一对用于解密和验证授权 cookie 内容(以及其他内容)的密钥. 在这个问题中也提到

    更改此密钥后,所有浏览器上存储的授权 cookie 内容将不再可读,并且授权丢失。

    最简单的补救措施是在 web.config 中使用静态 MachineKey

  • 还尝试将 cookie 设置为父域。更多信息在这里

于 2012-12-06T07:01:19.053 回答
1

当我的托管服务提供商过于频繁地回收我的网站进程时,我也遇到了这个问题。由于某种原因,身份验证 cookie 变得无效,因为加密/解密密钥发生了变化。因此,您的网站无法再读取身份验证 cookie。

您可以通过在 web.config 中指定密钥来解决此问题,以便您的托管服务提供商无法更改它们:

  1. 转到http://aspnetresources.com/tools/machineKey并单击按钮
  2. 复制生成的标签
  3. 打开您的 web.config 文件并将生成的标签粘贴到其中<system.web>
于 2012-12-06T13:34:57.830 回答
0

您还想设置登录时生成的 cookie 的过期时间。在表单身份验证中,您必须使用它。

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, //Here Userinformation, DateTime.Now, DateTime.Now.AddDays(1), false, string.Empty);

在这里,我已将 cookie 的过期时间设置为 DateTime.Now.AddDays(1)(登录日期+1 天),所以它太长了它会被登录。所以创建的票证将在您登录后的第二天过期。

在 Web.Config 中

  <authentication mode="Forms">
  <forms loginUrl="~/Account/LogOn" timeout="2880" />
</authentication>

现在很长一段时间都可以登录。

希望能帮助到你!!!

检查这些链接以更深入地了解创建登录和过期时间。

http://www.hanselman.com/blog/WeirdTimeoutsWithCustomASPNETFormsAuthentication.aspx

http://codeasp.net/blogs/vivek_iit/microsoft-net/848/forms-authentication-timeout-vs-session-state-timeout

于 2012-12-06T09:13:55.173 回答
0

您检查过 SessionState 中的值吗?它的默认值为 20 分钟。您需要将其更新为与表单身份验证票证相同或更高。

请在您的配置文件中添加/更新以下标签。

**<sessionState timeout="120" />**
于 2012-12-06T10:05:28.960 回答