我有一个gridview,其中一列包含图像。我已经使用灯箱来缩放点击的图像。但是,当我右键单击图像并选择“在新选项卡中打开链接”选项时,图像会在新选项卡中打开。这不是问题。
之后,我按下注销按钮。现在我复制该图像链接并将其粘贴到地址栏上,打开相同的图片。我希望首先检查用户是否已登录,然后如果他已登录则打开图像,否则未登录。网格视图的所有图像都存储在一个名为“产品图像”的文件夹中。
我已经在使用 gridview 的页面上检查登录状态。告诉我该怎么做。
您的问题是安全修剪未应用于您的图像。
静态资源不遵循与 asp.net 页面相同的路径,因此不会对图像应用安全修剪。
只要您有一个不允许未经授权的用户进入该图像文件夹的 web.config 文件,您就可以通过设置 web.config => system.webServer => modules来解决问题
<modules runAllManagedModulesForAllRequests="true">
...但这意味着所有资源都将通过 asp.net 管道进行路由,这可能会产生性能问题。
针对您的问题(我的解决方案):
我实际上会通过另一种方式,这会有点困难,那就是:
在您对难度和 Abhishek Punj 的回答发表评论后,我想提一下:
我的解决方案不需要为每种文件类型注册处理程序(如果之后添加 .jpg 文件类型并且没有注册呢?)。
此外,即使使用 Abhishek Punj 的回答,您仍然需要将图像数据从图像文件流式传输到响应。
此外,使用我的解决方案,您不需要在 ProcessRequest 自定义检查用户权限,但 ASP.NET 安全修整会处理它。
此外,我的解决方案尝试“保护文件夹”,其中 Abhishek Punj 尝试“保护全局文件类型”。
但最重要的是,Abhishek Punj 的回答意味着所有图像都将通过 ASP.NET 管道,这意味着如果您在登录表单中有任何图像,它们也不会显示给用户!毕竟,如果您要处理所有图像文件类型,那么为什么不使用 runAllManagedModulesForAllRequests="true",无需任何编码?
您可以创建一个新的处理程序并在 IIS 中为您的图像文件具有的扩展类型注册它。在开始请求的那个处理程序中,您可以检查用户是否使用表单身份验证设置的原则进行身份验证。这不会针对所有静态文件触发,因此会比 George 提到的解决方案执行得更好。
但是,您将面临另一个问题..所有静态资源都由浏览器缓存,因此它可能根本不会向服务器发送请求,而只是在未经身份验证的情况下向用户显示图像。
为了解决这个问题,您需要在您在第一步中编写的自定义处理程序的响应中设置 no-cache 标头,以便浏览器缓存响应并始终命中服务器以提供响应。
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 文件触发。因此增加了开销。
如果您想专门限制特定目录中的文件,一种非常简单的方法是将目录作为配置中的键提及并进行正则表达式比较以检查是否需要对请求进行身份验证..这也可以可以根据需要扩展以适应各种文件或目录,这些文件或目录要包含或限制在自定义配置部分中。
至于为具有其他文件扩展名的请求注册处理程序被认为是几秒钟的事情......这不是一项痛苦的任务。