求禁止未登录用户直接浏览器访问网站文件的方法

julychen1225 2014-01-16 04:49:42
我的需求:
要求某路径下的图片未登录用户不得通过输入全路径来查看。
如某图片存放在 http://www.abc.com/www/aa.jpg.
aa.jpg 不可以通过输入上述全路径访问到,必须是经过登录验证后方可查到该图片。
开发工具:VS2010,C#
服务器平台:WIN SERVER2007 IIS7.
...全文
1294 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
julychen1225 2014-01-23
  • 打赏
  • 举报
回复
引用 34 楼 julychen1225 的回复:
[quote=引用 33 楼 laiyongxin 的回复:]
我这样是有效的...不知道你是不是iis配置有问题


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;

namespace Web1
{
/// <summary>
/// JpgHandler 的摘要说明
/// </summary>
public class JpgHandler : IHttpHandler
{

public void ProcessRequest(HttpContext context)
{
string path = context.Request.PhysicalPath;
string serverHost = context.Request.Url.Host;
Uri u = context.Request.UrlReferrer;
context.Response.ContentType = "image/jpeg";
if (path.IndexOf("24.jpg")<=0)
{
path = context.Server.MapPath("~/Images/error.jpg");
context.Response.WriteFile(path);
}
else
{

path = context.Server.MapPath(context.Request.RawUrl);
context.Response.WriteFile(path);
}
}

public bool IsReusable
{
get
{
return false;
}
}
}
}

配置文件


<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="*.jpg" type="Web1.JpgHandler,Web1"/>
</httpHandlers>
<compilation debug="true"/>
</system.web>
</configuration>

我的iis运行的是集成模式,配置应该是
<system.webServer>
<handlers>
<add name="jpg" path="*.jpg" verb="*" scriptProcessor="ImgHandler" resourceType="Unspecified" preCondition="integratedMode" type="ImgHandler"/>
</handlers>
</system.webServer>[/quote]
不过我现在遇到的问题:网站下有个文件夹,配置为虚拟目录,地址是另一台服务器的共享文件夹,访问该文件夹下文件时老报错:

我配置的方法:就是两台服务器都建有同名同密码的用户iis_shared,所属组是IIS_IUSRS,权限完全控制;
asp.net模拟已启用,配置:

安全策略设置:

一切配置都好了 就是无法访问 崩溃了 跪求解决方法
julychen1225 2014-01-23
  • 打赏
  • 举报
回复
引用 33 楼 laiyongxin 的回复:
我这样是有效的...不知道你是不是iis配置有问题

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;

namespace Web1
{
    /// <summary>
    /// JpgHandler 的摘要说明
    /// </summary>
    public class JpgHandler : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            string path = context.Request.PhysicalPath;            
            string serverHost = context.Request.Url.Host;
            Uri u = context.Request.UrlReferrer;
            context.Response.ContentType = "image/jpeg";            
            if (path.IndexOf("24.jpg")<=0)
            {
                path = context.Server.MapPath("~/Images/error.jpg");
                context.Response.WriteFile(path);
            }
            else
            {

                path = context.Server.MapPath(context.Request.RawUrl);
                context.Response.WriteFile(path);
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}
配置文件

<configuration>
  <system.web>
    <httpHandlers>      
      <add verb="*" path="*.jpg" type="Web1.JpgHandler,Web1"/>
    </httpHandlers>
    <compilation debug="true"/>
  </system.web>
</configuration>
我的iis运行的是集成模式,配置应该是 <system.webServer> <handlers> <add name="jpg" path="*.jpg" verb="*" scriptProcessor="ImgHandler" resourceType="Unspecified" preCondition="integratedMode" type="ImgHandler"/> </handlers> </system.webServer>
lyx266 2014-01-20
  • 打赏
  • 举报
回复
我这样是有效的...不知道你是不是iis配置有问题

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;

namespace Web1
{
    /// <summary>
    /// JpgHandler 的摘要说明
    /// </summary>
    public class JpgHandler : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            string path = context.Request.PhysicalPath;            
            string serverHost = context.Request.Url.Host;
            Uri u = context.Request.UrlReferrer;
            context.Response.ContentType = "image/jpeg";            
            if (path.IndexOf("24.jpg")<=0)
            {
                path = context.Server.MapPath("~/Images/error.jpg");
                context.Response.WriteFile(path);
            }
            else
            {

                path = context.Server.MapPath(context.Request.RawUrl);
                context.Response.WriteFile(path);
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}
配置文件

<configuration>
  <system.web>
    <httpHandlers>      
      <add verb="*" path="*.jpg" type="Web1.JpgHandler,Web1"/>
    </httpHandlers>
    <compilation debug="true"/>
  </system.web>
</configuration>
天空丶蒋 2014-01-17
  • 打赏
  • 举报
回复
不是有个那啥过滤器么???????
wangyuping_2007 2014-01-17
  • 打赏
  • 举报
回复
自已写个代码判断下他是否登录不就可以了么
uinatlex 2014-01-17
  • 打赏
  • 举报
回复
实现 IHttpModule 接口 context.BeginRequest 委托新事件 事件通过判断请求和验证来决定导向 webconfig <system.webServer> -- <modules> -- add 这个类
lyx266 2014-01-17
  • 打赏
  • 举报
回复
引用 21 楼 laiyongxin 的回复:
iisr若发现请求是静态文件 比如 html css 图片等iis是不会将请求转交给.net处理,iis直接就去读取对应的文件然后返回给浏览器. 若你想客户在请求图片的时候也通过走.net的话你要在iis中配置一下 然后给图片类文件专门写个HttpModel类,在HttpModel中你去做登入判断
是写个专门的HttpHandler 而不是HttpModel
lyx266 2014-01-17
  • 打赏
  • 举报
回复
iisr若发现请求是静态文件 比如 html css 图片等iis是不会将请求转交给.net处理,iis直接就去读取对应的文件然后返回给浏览器. 若你想客户在请求图片的时候也通过走.net的话你要在iis中配置一下 然后给图片类文件专门写个HttpModel类,在HttpModel中你去做登入判断
魂之挽歌来袭 2014-01-17
  • 打赏
  • 举报
回复
引用 8 楼 julychen1225 的回复:
我直接输入图片地址就能访问 不需要登录就可以 禁止访问的代码要放在哪里?
可以自己写个类 实现IHttpModel借口 在类里面对请求进行判断 未登录的用户不让访问你的文件 然后在web.config中配置该类就OK了
淡淡的活着 2014-01-17
  • 打赏
  • 举报
回复
配置文件··
sxhmylove 2014-01-17
  • 打赏
  • 举报
回复
#17 没明白我意思啊,我是说直接访问图片,和页面有关系吗?连页面都没有,还用户控件? 比如网站是:www.xxx.com;图片路径在该站点下img文件夹下,我在地址栏输入www.xxx.com/img/x.jpg就访问了图片了
DragonerHuang 2014-01-17
  • 打赏
  • 举报
回复
引用 14 楼 sxhmylove 的回复:
[quote=引用 13 楼 DragonerHuang 的回复:] 创建一个用户控件,里面写一个判断, if(login=="true") { (登录成功) }else{ (请登录) return; }
如果我直接输入图片所在路径,不经过你的用户控件,这能玩吗[/quote] 比如这样说吧,你的这张图片是放在www.xx.detail.com里面的,那么你的这个页面会不会要用到这个用户控件的引用这个是你自己可以做个判断,我想你的图片都是放在其中的一个页面里面的,我说的那个用户控件是可以作为一个全局控件来使用,这样,每个页面都有这个判断了
julychen1225 2014-01-17
  • 打赏
  • 举报
回复
引用 29 楼 laiyongxin 的回复:
向 Web.config 文件添加下面的代码: <configuration> <system.web> <httpHandlers> <add verb="*" path="*.jgp" type="ImgProtectHadler.JpgHandler "/> /*配置正确的类全名*/ </httpHandlers> </system.web> </configuration>
都有配置 就是不起作用
julychen1225 2014-01-17
  • 打赏
  • 举报
回复
引用 28 楼 laiyongxin 的回复:
IIS 只将针对某些文件类型的请求传递给 ASP.NET 进行处理。默认情况下,具有 .aspx、.ascx、.asmx 等扩展名的文件已映射到 ASP.NET, 但是,如果您希望由 ASP.NET 来处理您所定义的文件扩展名,则必须在 IIS 中注册这些扩展名。有关更多信息,请参见 ASP.NET 应用程序生命周期概述。 在 IIS 中映射扩展名 打开“Internet 服务管理器”。 右击您的应用程序,然后选择“属性”。 在“目录”选项卡中,单击“配置”。 选择“映射”选项卡。 添加一个新的关联,将 .jpg 映射到要使用的 Aspnet_isapi.dll 版本。 如果希望无论是否存在用户请求的文件名,该处理程序都将运行,请清除“检查文件是否存在”复选框。
添加.jpg扩展名试了 还是不行
lyx266 2014-01-17
  • 打赏
  • 举报
回复
向 Web.config 文件添加下面的代码: <configuration> <system.web> <httpHandlers> <add verb="*" path="*.jgp" type="ImgProtectHadler.JpgHandler "/> /*配置正确的类全名*/ </httpHandlers> </system.web> </configuration>
lyx266 2014-01-17
  • 打赏
  • 举报
回复
IIS 只将针对某些文件类型的请求传递给 ASP.NET 进行处理。默认情况下,具有 .aspx、.ascx、.asmx 等扩展名的文件已映射到 ASP.NET, 但是,如果您希望由 ASP.NET 来处理您所定义的文件扩展名,则必须在 IIS 中注册这些扩展名。有关更多信息,请参见 ASP.NET 应用程序生命周期概述。 在 IIS 中映射扩展名 打开“Internet 服务管理器”。 右击您的应用程序,然后选择“属性”。 在“目录”选项卡中,单击“配置”。 选择“映射”选项卡。 添加一个新的关联,将 .jpg 映射到要使用的 Aspnet_isapi.dll 版本。 如果希望无论是否存在用户请求的文件名,该处理程序都将运行,请清除“检查文件是否存在”复选框。
DragonerHuang 2014-01-17
  • 打赏
  • 举报
回复
引用 18 楼 sxhmylove 的回复:
#17 没明白我意思啊,我是说直接访问图片,和页面有关系吗?连页面都没有,还用户控件? 比如网站是:www.xxx.com;图片路径在该站点下img文件夹下,我在地址栏输入www.xxx.com/img/x.jpg就访问了图片了
如果这样的,那就如上面他们说的那些,使用web配置,webclient这些来搞了
Zhang_qiankun 2014-01-17
  • 打赏
  • 举报
回复
制定拦截器试试
julychen1225 2014-01-17
  • 打赏
  • 举报
回复
引用 22 楼 laiyongxin 的回复:
[quote=引用 21 楼 laiyongxin 的回复:] iisr若发现请求是静态文件 比如 html css 图片等iis是不会将请求转交给.net处理,iis直接就去读取对应的文件然后返回给浏览器. 若你想客户在请求图片的时候也通过走.net的话你要在iis中配置一下 然后给图片类文件专门写个HttpModel类,在HttpModel中你去做登入判断
是写个专门的HttpHandler 而不是HttpModel[/quote] 我写了httphandler接口 可是程序没反应,我的程序: using System; using System.Web; namespace ImgProtectHadler { public class JpgHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { string path = context.Request.PhysicalPath; string serverHost = context.Request.Url.Host; Uri u = context.Request.UrlReferrer; if (u == null || u.Host.ToLower() != serverHost.ToLower()) { //context.Response.WriteFile("/error.jpg"); //context.RewritePath("/error.jpg"); context.Response.Write("请不要盗链本站资源,请从首页访问。<a href='Default.aspx'>首页</a>"); } else { //注意这里rar文件的ContentType是application/octet-stream //不同格式文件的contentType有可能不同 //context.Response.ContentType = "application/octet-stream"; //context.Response.WriteFile(path); context.Response.ContentType = "image/*"; context.Response.WriteFile(path); } } public bool IsReusable { get { return true; } } } }
julychen1225 2014-01-17
  • 打赏
  • 举报
回复
using System; using System.Web; namespace ImgProtectHadler { public class JpgHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { string path = context.Request.PhysicalPath; string serverHost = context.Request.Url.Host; Uri u = context.Request.UrlReferrer; if (u == null || u.Host.ToLower() != serverHost.ToLower()) { //context.Response.WriteFile("/error.jpg"); //context.RewritePath("/error.jpg"); context.Response.Write("请不要盗链本站资源,请从首页访问。<a href='Default.aspx'>首页</a>"); } else { //注意这里rar文件的ContentType是application/octet-stream //不同格式文件的contentType有可能不同 //context.Response.ContentType = "application/octet-stream"; //context.Response.WriteFile(path); context.Response.ContentType = "image/*"; context.Response.WriteFile(path); } } public bool IsReusable { get { return true; } } } } 类错在哪里?没反应
加载更多回复(15)

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧