6

我遇到了一个非常糟糕的问题,无论我尝试什么,用户都会在 10 分钟后被注销。

我正在使用在 Server 2003 R2 Standard Edition 上的 IIS 6.0 上运行的 ASP.Net 2.0,作为具有所有适用更新和 .Net 3.5 SP1 的虚拟服务器运行。

客户端是 Internet Explorer 7.0

以下是 web.config 设置:

<!-- Authentication Mode -->
<authentication mode="Forms">
  <forms name=".RecipeViewer" timeout="240" />
</authentication>

以下是用于设置授权 cookie 的代码:

Private Sub SetCookie(userName)
                ' Use security system to set the UserID within a client-side Cookie
                Dim ticket As New FormsAuthenticationTicket(1,userName, DateTime.Now, DateTime.Now.Add(Me.GetFormsAuthSettings.Forms.Timeout), True, String.Empty, FormsAuthentication.FormsCookiePath)
                Dim hash As String = FormsAuthentication.Encrypt(ticket)
                Dim cookie As New HttpCookie(FormsAuthentication.FormsCookieName, hash)

                cookie.HttpOnly = True

                If (ticket.IsPersistent) Then
                    cookie.Expires = ticket.Expiration
                End If

                Response.Cookies.Add(cookie)

                ' Redirect browser back to originating page
                Response.Redirect(Request.ApplicationPath)
End Sub

    Private Function GetFormsAuthSettings() As System.Web.Configuration.AuthenticationSection
        Return DirectCast(System.Configuration.ConfigurationManager.GetSection("system.web/authentication"), System.Web.Configuration.AuthenticationSection)
    End Function

我以前使用过 FormsAuthentication.SetAuthCookie 甚至尝试过 FormsAuthentication.RedirectFromLoginPage 方法,但是这些方法都具有相同的结果,这就是为什么我最终执行了内部完成的硬 cookie 实现(通过在 Reflector 中查看) FormsAuthentication 类可以。


该问题在 Visual Studio 2008 asp.net 托管环境或 IIS 7.0 中无法重现


编辑:启用 Cookie,甚至托管站点也已添加为受信任站点。


编辑:谷歌浏览器和火狐没有这个问题。


编辑:目标机器上的已验证 Cookie 根据设置设置为 4 小时后过期(超时 = 240 分钟)。


编辑:正如豪斯所说,每个人都在撒谎。用户实际上并没有测试新的代码库,而是基于一个先入为主的想法,即该软件仍然存在问题。感谢所有在此主题中回复的人。

不要关闭它不再相关,而是保留它以帮助人们解决问题,因为这个问题中有一些非常好的故障排除技术。

4

7 回答 7

6

也可能(已经)没有设置机器密钥,因此每次初始化应用程序时都会随机生成(这意味着加密的身份验证票证将用新密钥加盐)。

我使用一个站点为我的应用程序生成一个新的机器密钥并将其粘贴在 web.config 中:

http://www.orcsweb.com/articles/aspnetmachinekey.aspx

<?xml version="1.0"?>

<configuration>

    <appSettings/>
    <connectionStrings/>
    <system.web>

        <machineKey validationKey='FED01BCB246D3477F5854D60388A701508AD1DF9099BD3CAC3CA4DAF55F7524B8DD3FA03133BBCA381BC1CD639730445968DFA633A97911187EF187456D692F4' decryptionKey='861E7DF7C2D04297EEFAD47FF3B95F54E87CF28D6C2753D8' validation='SHA1'/>

    </system.web>
</configuration>
于 2009-01-12T16:46:37.653 回答
1

虽然您的要求是 IE,但您可以使用带有 Firebug 和 FireCookie 的 Firefox 来监控您的 cookie 和过期时间。

在 IE 中,您可以下载 IE 开发人员工具栏,在其中您可以使用缓存\查看 Cookie 信息菜单查看您的 cookie 值。

如果它在 Google Chrome 中正常工作很奇怪,也许您可​​以使用 global.asax 中的 Application_BeginRequest 事件捕获请求并记录收到的 cookie 及其值。

于 2009-01-12T15:42:44.037 回答
1

未处理的异常可能会导致 proc 重新启动。这可能会增加奇怪的行为。事件日志中是否有任何报告?

于 2009-01-12T16:00:21.927 回答
0

我隐约记得 IIS 会话超时设置能够覆盖您在 web.config 中设置的任何内容。检查您的应用程序属性未设置 10 分钟的超时(属性-> 配置-> 选项)。

于 2009-01-12T15:24:42.013 回答
0

过去我也遇到过类似的问题,但我不确定你在说什么。您的问题不会发生在生产系统(或任何频繁负载的系统)上,我说得对吗?如果是这样,问题可能是工作线程空闲超时。您可以尝试更改它或在 IIS 管理器下将其关闭 -> 右键单击​​应用程序池,转到性能选项卡,它是空闲超时下的复选框。该对话框的回收选项卡上的内容也可能对您感兴趣。

于 2009-01-12T15:34:56.767 回答
0

客户没有测试生产代码,并且在将补丁应用到他们的生产环境之前仍然响应上一个问题。

如果您无法在同一环境中复制它,我建议您召开一次会议,在那里您可以观看他们复制问题。


48 小时后将此标记为答案。

于 2009-01-12T16:30:32.317 回答
0

将会话状态更改为使用 InProc 存储,您可能会面临与我的问题类似的问题,即当用户遇到错误时,每次不使用 InProc 存储会话时,会话基本上都会死掉。

会话类型: http: //msdn.microsoft.com/en-us/library/ms178586 (v=vs.100).aspx

于 2012-09-11T08:38:42.930 回答