0

按照我可以从 HTTPModule 访问会话状态中找到的解决方案吗?,我可以从 IHttpModule 访问会话状态。我用它来控制对某些文件的访问,所以如果有人没有访问权限,我想将它们重定向到登录页面。当我尝试做一个 HttpContext.Current.Response.Redirect(page); 它锁定了网络服务器。所以我的帖子获取请求状态函数看起来像这样......

 void Application_PostAcquireRequestState(object source, EventArgs e)
    {            
        HttpApplication app = (HttpApplication)source;

        MyHttpHandler resourceHttpHandler = HttpContext.Current.Handler as MyHttpHandler;

        if (resourceHttpHandler != null)
        {
            // set the original handler back
            HttpContext.Current.Handler = resourceHttpHandler.OriginalHandler;
        }

        HttpContext context = HttpContext.Current;
        string filePath = context.Request.FilePath;
        context.Trace.Write("HttpDownloadModule", "File path: " + filePath);

        Boolean hasAccess = true;

        if (filePath.Contains("content/downloads"))
        {
            //check to make sure a session has been established already....
            if (context.Session == null)
                hasAccess = false;

            SecurityBLL security = new SecurityBLL();
            string fileName = filePath.Split('/').Last();

            //check to see if a user is logged in
            if (!CitrixAccess.loggedin)
                hasAccess = false;

            //check access for download
            if (!security.checkSecurityByDownload(fileName))
                hasAccess = false;

            if (!hasAccess)
            {
                HttpContext.Current.Handler = resourceHttpHandler.OriginalHandler;
                HttpContext.Current.Response.Redirect("../../login.aspx");
            }
        }

    }

有什么想法吗?谢谢您的帮助!

4

2 回答 2

0

好的,所以我找到了一种解决方法......我将我的 hasAccess 变量移动到全局并添加了一个 EndRequest 处理程序。所以我正在检查 EndRequest 中的 hasAccess 并从那里进行重定向。

于 2010-04-16T20:21:54.293 回答
0

我的回答包括Arthurdent510 的回答,但我没有足够的声誉来简单地评论他的回答哈哈。他的回答帮我弄清楚了我必须去哪里,但对我来说还不够完整。

将 Response.Redirect 调用放入 EndRequest 处理程序会导致无限循环。我认为这是因为 Response.Redirect 导致 EndRequest 被调用。所以 EndRequest 一直被一遍又一遍地调用。

为了解决这个问题,我添加了一个私有布尔值来指示我是否已经调用了重定向。如果我已经调用了重定向,那么我不会再调用 Response.Redirect。这就是我的 EndRequest 方法的样子:

Private Sub Application_EndRequest(ByVal source As Object, ByVal e As EventArgs)
    If Not _blnHasAccess AndAlso Not _blnRedirected Then
        _blnRedirected = True
        HttpContext.Current.Response.Redirect("~/Error.aspx")
    End If
End Sub
于 2014-01-03T21:12:14.280 回答