检查用户是否已登录
本文关键字:登录 是否 用户 检查 | 更新日期: 2023-09-27 18:34:12
我有一个网格视图,其中一列包含图像。我使用灯箱缩放点击的图像。但是当我右键单击图像并选择"在新选项卡中打开链接"选项时,图像将在新选项卡中打开。 这不是问题。
之后,我按注销按钮。现在我复制该图像链接并将其粘贴到地址栏上,打开了相同的图片。我希望首先应该检查用户是否已登录,如果他已登录,则打开图像,否则未登录。网格视图的所有图像都存储在名为"产品图像"的文件夹中。
我已经在使用网格视图的页面上检查登录状态。告诉我该怎么做。
您的问题是您的图像未应用安全修整。
静态资源不遵循与 asp.net 页面相同的路由,因此不会对图像应用安全修整。
只要您有一个 web.config 文件,该文件不允许未经授权的用户进入该图像文件夹,您就可以通过在 web.config => system.webServer => 模块中设置来处理问题
<modules runAllManagedModulesForAllRequests="true">
。但这意味着所有资源都将通过 asp.net 管道进行路由,这可能会产生性能问题。
回答您的问题(我的解决方案(:
我实际上会通过另一种方式,这会有点困难,那就是:
- 使用 IIS 使文件夹产品图像对任何用户不可见 请求筛选(=>隐藏段=> 禁止访问该文件夹(
- 然后创建一个自定义 http 句柄(.ashx 文件(,其中我将图像名称作为参数。ProcessRequest 中的该处理程序将获取图像参数,打开特定文件并将数据从图像流式传输到响应。
- 在安全修整下,只要它通过管道 ASP.NET 处理就很容易,因此未登录的用户将无法访问处理程序。性能会慢一些,但仅适用于这些特定图像。另请注意,您应该更改对图像的任何直接调用。例如,如果您有src='/product images/imageA.png',则应更改为src='/ImagesHandler.ashx?image=imageA.png'。
在你对困难的评论和Abhishek Punj的回答之后,我想提一下:
我的解决方案不需要为每种文件类型注册处理程序(如果之后添加.jpg文件类型但尚未注册怎么办?
此外,即使有Abhishek Punj的答案,您仍然需要流式传输图像数据从图像文件到响应。
此外,使用我的解决方案,您无需自定义检查进程请求中的用户权限,但 ASP.NET 安全修整会处理它。
另外,我的解决方案尝试"保护文件夹"Abhishek Punj 试图"全局保护文件类型"。
但最重要的是,Abhishek Punj的回答意味着所有图像都将通过 ASP.NET 管道,这意味着如果您有任何图像例如,登录表单时的图像不会向用户显示太!毕竟,如果您要使用所有图像文件类型,那么为什么不使用runAllManagedModulesForAllRequests="true",而无需任何编码?
可以创建新的处理程序,并在 IIS 中为图像文件具有的扩展名类型注册该处理程序。在开始请求的处理程序中,您可以检查用户是否使用表单身份验证设置的原则进行身份验证。这不会为所有静态文件触发,因此性能比 George 提到的解决方案更好。
但是,您将面临另一个问题..所有静态资源都由浏览器缓存,因此它可能根本不会向服务器发送请求,而只是将图像显示给用户而无需身份验证。
要解决此问题,您需要在第一步中编写的自定义处理程序的响应中设置 no-cache 标头,以便浏览器 dosent 缓存响应并始终命中服务器以提供响应。
Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.
希望这能给你想要的方向。
编辑:基于乔治提出的观点
runAllManagedModulesForAllRequests="true"不仅会为所有图像触发,还会为所有CSS文件和javascript文件触发,从而增加开销。
如果你想专门限制特定目录中的文件,一个非常简单的方法是在配置中提及该目录作为键,并进行正则表达式比较以检查请求是否需要进行身份验证。 这也可以扩展以满足各种文件或目录的需要,根据需要通过自定义配置部分来包含或限制。
至于使用其他文件扩展名注册请求的处理程序被认为是几秒钟的问题......这不是一项痛苦的任务。