2013-09-30 68 views
5

我有一个下载页面,其中包含指向本地存储在Web服务器上的文件的链接。当用户打开一个文本文件时,一切都很好,但是当他们打开Office文件并从IE或Firefox中的对话框中选择“打开”时,ASP会创建一个新的会话。下载文件时ASP.MVC会话丢失

我简化控制器的方法是:

<HttpGet()> 
<AppAuthorize(Domain.Security.TransactionId.Download)> 
Public Function Download(fileName As String) As ActionResult 
    ' fileName example: C:\ProgramData\MyCompany\MyApp\SomeFile.txt 
    Return New FilePathResult(fileName, "application/octet-stream") 
End Function 

调试表明,只要你在浏览器中点击“打开”时,将触发在Global.asax在session_start()事件。

enter image description here

如果您保存该文件,然后查看它在IE一个新的会话不会创建。如果您单击上图中的打开按钮,这只是一个问题。

这是为什么,我该如何防止它?

核心问题是,当我的应用程序看到新会话启动并且用户具有有效的表单身份验证cookie时,它会假定IIS重新启动并删除用户的Cookie。所以每当用户打开Word文档时,他们都会从应用程序中注销。

+0

您是否在使用会话状态进行应用授权?如果是这样,你有严重的安全漏洞...会话不应该用于安全。 –

+0

不,我正在使用表单身份验证的自定义实现。会话状态和“注销”之间的链接是,如果我检测到新会话并且用户具有有效的表单身份验证cookie,则我假定IIS重置并删除其auth cookie以保持数据完整性。请参阅http://www.netnewsgroups.net/aspnet/t4780-forms-authentication-session-expiration.aspx – nunzabar

回答

2

当在Internet Explorer中单击DOC链接时,它会将它交给Word。这意味着Word会下载,而不是IE。正因为如此,有一个新的“浏览器连接”,并创建一个新的会话,因为它实际上不是IE做下载。

+0

好吧,以便解释“为什么”...现在我该如何修复它?这一定是一种常见的情况。 – nunzabar

2

我在回答我自己的问题。

我发现一个解决方案Matt's answer指出我在正确的方向。

<SessionState(SessionStateBehavior.Disabled)> 
Public Class AttachmentController 
    ... 
End Class 

现在办公室可以下载文件,但不会触发新会话:我只需添加一个属性,如下所示禁用SessionState会的控制器。我的应用程序不再被破坏。