精灵巫婆 发表于 2015-1-16 22:20:05

ASP.NET编程:ASP.NET中完成文件的回护性下载基本篇

另外,小型软件代码重用价值低,没有必要跨平台;大型软件,有严格的规划、部署,不可以随意跨平台。1、文件回护性下载的需求  假如我们必要在站点上出卖数字情势的商品,如电子书、数字油画等,那末怎样在供受权用户一般下载的同时又制止非受权用户不法下载您的产物呢?经由过程Forms身份考证,只能使这个成绩失掉部分化决。本文中,我将解说怎样避免某些用户会见站点上的某些文件;即便这些文件可以被这些用户间接扫瞄。
  办理这个成绩的办法有多种,可是有些办法自己就有成绩。本文中,我们将考查软件供给厂商经常使用的一些手艺,然后再先容一种新的办理计划。必要注重的是,这里先容的是针对ASP.net站点的。
  2、罕见的文件回护手艺
  我们中良多人都有网上购置软件的履历,以是大概领教过用于文件下载的罕见回护措施。上面,我们对它们举行考查。
  紧缩文件口令回护
  这类回护办法对照复杂,它不是避免您下载文件,而是避免未经受权的职员从紧缩文件中提取文件的内容,由于WinZip和很多其他紧缩程序都供应了口令回护功效。但是,这类办法的弱点也很分明,假如您同意或人会见该文件内容,那就必需给他供应口令,以后,您却没法制止这团体将口令传给其别人。实践上,假如您搜刮互联网的话,会发明林林总总的口令各处都是。接纳这类回护措施的时分,只能期望受权用户是有品德的人,不会将口令别传。大概,将这类回护措施供应一个条理,为每一个人天生一个分歧口令的紧缩文件,然后传给他。固然,这必要一个文件存储办理计划,由于必要能把持发送给用户的文件。这招致第二种文件回护办法。
  电子邮件
  很多软件供给厂商其实不会把文件张贴到它们的网站上,而是向购置该软件的用户发送一封电子邮件,告诉下载具体信息,大概间接连同文件一块发已往。电子邮件能够包括文件下载链接,并限制该链接的无效工夫。偶然候,软件供给商还能够将这类这类手艺跟口令回护相分离。文件一旦交到用户手里,剩下的回护措施就靠软件允许和注册了。其他基于电子邮件的办理计划另有静态天生文件名办法。
  一时文件名
  一些软件供给厂商会利用GUID大概别的的奥密的定名手艺天生一个难以推测的文件名,同时还能够令文件只能在划定工夫内下载。
  3、手艺剖析
  固然这些手艺仍在利用,可是它们却不克不及在您的站点上启示一片客户地区,使得用户可以反省他们的购置汗青纪录,并随时从头下载他们的软件。依我看来,供应了相似功效的站点可以供应更好的用户体验,对软件供给商来讲也更简单办理――用户购置产物以后,您仅需给用户发送一封包括允许证密钥和他们在站点上响应客户地区的链接便可。如许的话,用户晓得能够随时登录和下载软件,他们就会放心多了,即便弄丢了软件文件也不必怕了。
  为此,我们将先容一种分离了ASP.net的Forms身份考证和称为HTTP处置程序的回护计划来供应这类优秀的用户体验。类System.Web.UI.Page自己就是一个HTTP处置程序,而且会注册到您的呆板的Web.config文件中。
内容导航  4、HTTP处置程序
  实践上,利用ASP.NET定制HTTP处置程序并没有人们设想的那末庞大,上面我们用只管简单了解的体例来会商这一主题。HTTP处置程序的使用有良多,不外我们这里次要会商它在文件回护成绩方面的使用。

  IIS中的扩大名映照
  上面我们将先容甚么是处置程序,及其事情道理,同时我们力图做到举行大概复杂。在当ASP.NET情况中,您哀求一个ASPX页面的时分,IIS会将该哀求传送给响应的DLL来举行处置。所谓HTTP处置程序,就是处置IIS传给它们的哀求的那些类。当您在呆板上安装ASP.NET的时分,会伴同向IIS增加一串表项(拜见)。这些表项包括但愿ASP.NET处置的文件的扩大名(ASPX、ASMX等等)。当我们哀求一个ASPX的时分,IIS收到该哀求后,会将其传送给响应的DLL,在本例中为aspnet_isapi.dll,随后临盆响应的HTTP处置程序实例来处置该哀求。就ASPX页面而论,用到的HTTP处置程序是位于System.Web.UI定名空间中的一个Page类。
  就ASPX页面而论,页面处置程序用来把持和触产生命周期事务;当您扫瞄一个ASPX页面的时分,基础上统统事情都是由它来处置的。但是,您能够编写一个定制的HTTP处置程序来拦阻扫瞄器收回的一切的哀求,从而调剂大概定制一般产生的举措。为此,我们必要用到多种手艺,本文中我将起首会商个中的IIS表项,和Forms身份考证有关内容。
  5、IIS与Forms身份考证
  后面提过,IIS会把注册的扩大名发送到aspnet_isapi.dll。展现的是找到的已注册扩大名。我们能够在假造目次大概网站的“Properties”中的“Configuration”选项就能够看到这个对话框。带有由aspnet_isapi.dll举行处置的已注册扩大名的任何文件都遭到ASP.NET的Forms身份考证的安排。上面我们对Forms身份考证的运转机制做复杂先容。
  定制的HTTP处置程序实践上就是完成了IHttpHandler接口的那些类。Forms身份考证同意您避免匿名用户在未受权的情形下会见某些web页面。文件web.config使用以下代码来设置Forms身份考证:


CodehighlightingproducedbyActiproCodeHighlighter(freeware)
http://www.CodeHighlighter.com/

<authenticationmode="Forms">
<formsloginUrl="Login.aspx"/>
</authentication>
<authorization>
<denyusers="?"/>
</authorization>  下面的代码会避免没有经由过程身份考证的用户会见一切的页面。假如一个匿名用户试图会见一个网页,该代码会主动地将他们重定向到Login.aspx页面。如许一来,站点开辟职员就可以决意在这个页面中利用哪一种身份考证办法,可是在ASP.NET2.0中,开辟职员能够很轻松地利用新的平安控件来完成此项事情。
  如今,我们说过这个代码可以制止未经由过程身份考证的用户会见任何页面,可是正确来讲它是制止了未经认证的用户会见一切被aspnet_isapi.dll拦阻的那些文件。这将在前面详加注释。为了给本文的前面的内容做展垫,我们必要先形貌示例电子商务站点的一些详细细节。
内容导航  6、回护措施计划
  假定我们的站点利用户能在线购置软件,可是在购置大概下载软件之前,用户必需起首注册。然后,分离为用户和产物创建一个表,然后分离寄存用户名和产物序列号。当用户购置软件的时分,经由过程在另外一个表中创立一个纪录来联系关系用户和产物。我们称这个表为UserProducts。
  我们想把一切的软件产物文件存储在一个称为files的文件夹中,该文件夹位于网站的根文件夹当中。产物表有一个字段,用于产物文件名,该文件名对应于files文件夹中的一个紧缩文件。我们称这个字段为ProductFileName。上面我们慢慢先容怎样回护这些ZIP文件。
  7、回护一切的紧缩文件
  起首,我们要避免一切的紧缩文件被未履历证的用户所下载。我们要让一切扩大名为.zip的文件经过ASP.NET的Forms身份考证处置,如许匿名用户就不克不及会见它们了。固然这一步并非最关头的,可是它的确供应了文件的平安性。
  一般假如您能间接扫瞄某网站上的一个ZIP文件,该站点会提醒您翻开大概将该文件保留到硬盘上。我们想让ASP.NET拦阻对扩大名为zip的文件的哀求,以是必要在IIS的使用程序映照表中增加响应的扩大名。
  为此,能够翻开IIS的办理把持台,找到响应的站点或假造目次,单击右键并选择“Properties”选项,就会显现。假如单击“WebSite”大概“VirtualDirectory”选项卡中的“Configuration”按钮的话,就会看到扩大名表和用于处置它们的DLL,见。我们必需将扩大名“zip”增加到这个列表中,为此,能够单击“add”按钮,然后再扩大名文本框中键进“zip”,并单击“Limittoverb”选项按钮。

网站属性

导航至aspnet_isapi.dll
内容导航  在Verbs文本框中,键进GET、HEAD、POST、DEBUG,以唆使aspnet_isapi.dll拦阻zip范例文件的哀求。在Executable:文本框中,导航至aspnet_isapi.dll文件的地位,见。这个文件位于响应框架版本文件夹下的C:WINDOWSMicrosoft.NETFramework目次中,如所示。
  

给IIS增加zip扩大名映照
  

映照zip扩大名
  创建这个表项后,我们的映照表将如所示。注重在这个表中的一切其他扩大名比方VBPROJ、CONFIG等等,aspnet_isapi.dll也会拦阻这些扩大名以便举行回护。这就是当妄图扫瞄web.config文件时会被重定向到一个回绝页面的缘故原由。
  在IIS中创立这个表项以后,假如实验间接扫瞄我们站点上的ZIP文件的时分,假如用户没有经由过程身份考证的话,IIS会将其重定向到登录页面。以是,如今我们已可以避免匿名用户下载我们的文件了,不外,一旦经由过程了站点的身份考证,这类回护就形同虚设了。
内容导航  8、加倍详细的回护措施
  我们的方针是,让受权用户可以扫瞄一个包括了已购置的软件的页面,而且经由过程单击个中的链接就能够下载特定的商品。列生产品时,可使用表布局,可是怎样来回护链接呢?之前我们先容的办法只是避免匿名用户下载紧缩文件,可是如今我们要避免受权用户间接扫瞄紧缩文件。为此,我们必要编写一个定制的处置程序。
  定制的HTTP处置程序是完成了IHttpHandler接口的类。这个接口界说了一个称为ProcessRequest的办法,和一个Boolean范例的名为IsReusable的属性。该属性决意了别的哀求是不是可以使用统一个处置程序,以是这里复杂前往一个真值。这个办法将会收到一个HttpContext范例的参数。这变量为我们供应了会见该哀求全部高低文的权限,包含哀求中的信息和订制另外一个偏向上的哀求的办法。
  如今,我们要创立一个称为FileDenialHandler的处置程序,它的感化是中断一个哀求,并将用户重定向到一个页面来关照他们会见被回绝。当这个处置程序获得该哀求的时分,就会挪用ProcessRequest办法而且实行重定向。


CodehighlightingproducedbyActiproCodeHighlighter(freeware)
http://www.CodeHighlighter.com/

publicvoidProcessRequest(HttpContextcontext)
{
context.Response.Redirect(
"~/Downloads/Files/AccessDenied.aspx");
}  如您所见,这个页面位于根目次的Downloads/Files文件夹中,完全的FileDenialHandler.cs处置程序以下所示:


CodehighlightingproducedbyActiproCodeHighlighter(freeware)
http://www.CodeHighlighter.com/

usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
namespaceDotNetDude.Web.UI
{
publicclassFileDenialHandler:IHttpHandler
{
publicvoidProcessRequest(HttpContextcontext)
{
context.Response.Redirect(
"~/Downloads/Files/AccessDenied.aspx");
}

publicboolIsReusable
{
get
{
returntrue;
}
}
}
}  如今,这个FileDenialHandler类甚么也没做,以是必需将其写进站点。为了如许,我们将其放进web.config文件的中。
  文件web.config列出了设置部分的一切特别处置程序,并为其划定了响应的信息,包含实例化这个处置程序的谓词,婚配要让这个处置程序来处置的文件的通配符路径,和用于该定制的处置程序的范例界说。在这个例子中,增加的设置部分以下所示:


CodehighlightingproducedbyActiproCodeHighlighter(freeware)
http://www.CodeHighlighter.com/

<httpHandlers>
<addverb="*"path="*.zip"
type="DotNetDude.Web.UI.
FileProtectionHandler,
DotNetDude.HttpHandlers"/>
</httpHandlers>  参数type是尺度的.NET完整限制名写法,并经由过程逗号组合了一个组件程序集称号。在实践的Web项目中编写处置程序的时分,能够省往程序集称号。
  如今这个条目将一切的紧缩文件哀求转发给新的处置程序,因而当即将哀求重定向到“AccessDenied”页面。即便在本例中跳过该IIS条目,它仍旧会照旧事情,由于这些事变都交由我们的处置程序了。但是,我们想要的效果是让体系在判断匿名用户会见不法的ZIP文件之前,起首把他们导航至登录页面。
  假如反省框架目次中的web.config文件,就会发明一列处置罕见文件扩大名用于ASP.NET的处置程序。界说这个文件中的部分的处置程序决意了IIS怎样得当地转发ASPX页面、ASMXWeb服务和一切其他文件。这个处置程序列表还界说了哪些文件扩大名是禁用的,比方*.config。现实上,能够使用一个称为HttpForbiddenHandler的处置程序来禁用一切以扩大名.config开头的文件,并主动显现一个“HTTP403errorForbidden:Accessisdenied”页面。
  以是您大概问,无甚么不但用Microsoft供应的处置程序来处置紧缩文件呢?谜底是,固然能够用,不外我们必要本人的“accessdenied”页面,如许经由过程定制我们本人的回绝页面,就可以跟我们的网站作风坚持分歧。在某些情形下,我们还想为用户供应更多的信息,乃至向办理员发送“未经受权的实验”类电子邮件。
  这里只是避免下载一切的紧缩文件,可是我们实践想要做的是甚么?对了,我们要获得从我们站点上文件下载体例的相对把持权。我们不想让用户间接扫瞄紧缩文件。经由过程表布局,我们可创建一个项目、用户列表,和每一个用户购置产物的干系表。因而假如我们有一个用户名和一个产物序列号,就能够经由过程一个复杂的数据库查询来判别这个用户是不是购置了这个产物。同时,我们还想让用户只需单击一个链接就可以启动查询并断定是不是被同意下载文件。这些功效切实其实十分使人憧憬。
内容导航  9、把持下载
  上面,我们入手下手报告怎样编写一个用于某些文件哀求的处置程序,和该处置程序的安装办法。我们的处置程序的功效很复杂,它只是将哀求重定向到其他中央罢了。ASP.NET还供应了别的一种文件扩大名即ASHX,它无需安装到web.config文件中。我们能够创立一个以这个扩大名开头的类,来完成IHttpHandler接口,并就间接导航至该类。实践上它与一个页面十分相似,只是它不会利用Web表单和Code-Behind类,以是它是一种加倍简便的计划。
  如今,我们创立一个新的处置程序称为Download.ashx,并让用户扫瞄到该处置程序的地位,同时在QueryString参数中划定一些信息。上面的URL就是下载链接:
  ~/Downloads/Download.ashx?Product=101
  这个URL暗示下载与产物101有关的文件。用户大概链接能够会见上述URL来试图下载一个文件,这时候,该处置程序的ProcessRequest办法就会实行。
  使用尺度Forms身份考证对用户身份举行考证,如许就可以会见在我们站点高低文中的User工具。请记着,HTTP高低文会传送给该处置程序的ProcessRequest办法,以是能会见到所需的内容。工具User同意我们取得利用User.Identity.Name的受权用户的称号,另有,我们还可使用该办法会见User表中的用户。会见用户的称号,我们要利用User.Identity.IsAuthenticated的值来反省他们是不是已过身份认证,假如没有,将其重定向到“accessdenied”。别的,我们还要会见哀求的产物号码,代码以下所示:


CodehighlightingproducedbyActiproCodeHighlighter(freeware)
http://www.CodeHighlighter.com/

context.Request.QueryString["Product"]  如许,我们就获得了产物号码和用户名。有了这二者,我们就能够会见UserProducts表并断定这个用户是不是购置过这个产物。别的,这个表还存储有该产物的文件名。
  既然有了用户名和产物号码,并经由过程它们断定除用户购置情形。假如该用户没有购置响应的产物,我们就将其重定向到后面的处置程序,并前往一个会见回绝页面。为简便起见,我们将其重定向到一个告诉他们还没有购置过此产物的页面,并告诉怎样举行购置。
  假如断定该用户购置了这个产物,能够经由过程ProductFileName字段懂得该用户能够检察哪些文件。这里,我们没有存储完全的路径,只是存储了文件名。假如必要,我们能够从web.config中的设置来取得该文件夹,以是终极取得了完全的文件路径和称号,并受权下载。上面我们经由过程称为StartDownload办法来完成此义务:


CodehighlightingproducedbyActiproCodeHighlighter(freeware)
http://www.CodeHighlighter.com/

privatevoidStartDownload(
HttpContextcontext,stringdownloadFile)
{
context.Response.Buffer=true;
context.Response.Clear();
context.Response.AddHeader(
"content-disposition",
"attachment;filename="+downloadFile);
context.Response.ContentType=
"application/zip";
context.Response.WriteFile(
"~/Downloads/Files/"+downloadFile);
}  这里的ProcessRequest办法会挪用StartDownload办法,完全的Download.ashx代码以下所示:


CodehighlightingproducedbyActiproCodeHighlighter(freeware)
http://www.CodeHighlighter.com/

<%@WebHandlerLanguage="C#"Class="Download"%>
usingSystem;
usingSystem.Web;
publicclassDownload:IHttpHandler
{
publicvoidProcessRequest(HttpContextcontext)
{
if(context.User.Identity.IsAuthenticated)
{
if(context.Request.QueryString["Product"]!=null
&&context.Request.QueryString["Product"]!="")
{
intproductID=Convert.ToInt16(
context.Request.QueryString["Product"]);
stringuserName=context.User.Identity.Name;
UserProductproduct=UserProductFactory.GetProductByUser(
userName,productID);
if(product!=null)
StartDownload(product.FileName);
else
context.Response.Redirect(
"~/Downloads/Files/AccessDenied.aspx");
}
}
}

publicboolIsReusable
{
get
{
returnfalse;
}
}
privatevoidStartDownload(stringdownloadFile)
{
context.Response.Buffer=true;
context.Response.Clear();
context.Response.AddHeader(
"content-disposition",
"attachment;filename="+downloadFile);
context.Response.ContentType="application/zip";
context.Response.WriteFile(
"~/Downloads/Files/"+downloadFile);
}
}  这个办法会收到文件的称号和HttpContext。由此处,我们将清空呼应缓冲区,设置一个新的头部,然后设置内容范例。最初,利用WriteFile办法输入该文件,终极用户会收到一个文件保留或翻开窗口。
  注重,利用WriteFile会输入ZIP文件,而是要Response.Redirect则会把用户重定向到会见回绝页面。利用这类手艺的时分,伶俐的用户能够绕过平安反省而间接导航至Download.ashx文件。但即便它们想法间接扫瞄到ZIP文件,也会被FileDenialHandler处置程序重定向到会见回绝页面。
  注重这两品种型处置程序的区分,一个是能够放在内部组件中的尺度C#(大概VB.NET)类,假如您必要编写可重用的处置程序的时分,这类范例对照幻想,由于您能够把它们编译成一个静态链接库,并在分歧的站点之间分享。固然,我们必要在web.config文件中对它们举行注册。关于ASHX范例的处置程序,能够像ASPX页面一样增加到站点中。现实上,我们可使用其他手艺来完成相似Download.ASHX的功效,可是ASHX处置程序是加倍简便的办理计划。
  10、小结
  利用ASP.NET回护文件下载的一切办法中,使用HTTP处置程序是最主要的一种。经由过程与其他手艺相分离,我们不但可以避免非受权用户下载文件,还能在处置用户下载文件试图时取得相对把持权,但愿本文的内容对您可以有所匡助。
前几天同学问我学习方向的问题。有点想法,不知道对不对,怕误导同学,现在“开源一下”。注:括号内是我现在整理的时填加上的。

乐观 发表于 2015-1-19 08:53:57

提供基于组件、事件驱动的可编程网络表单,大大简化了编程。还可以用ASP.NET建立网络服务。

再现理想 发表于 2015-1-25 15:45:20

市场决定一切,我个人从经历上觉得两者至少在很长时间内还是要共存下去,包括C和C++,至少从找工作就看得出来,总不可能大家都像所谓的时尚一样,追捧一门语言并应用它。

若天明 发表于 2015-2-3 05:10:44

JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。

老尸 发表于 2015-2-8 19:54:01

ASP是把代码交给VBScript解释器或Jscript解释器来解释,当然速度没有编译过的程序快了。

爱飞 发表于 2015-2-26 00:44:37

主流网站开发语言之JSP:JSP和Servlet要放在一起讲,是因为它们都是Sun公司的J2EE(Java2platformEnterpriseEdition)应用体系中的一部分。

愤怒的大鸟 发表于 2015-3-8 10:59:15

可以看作是VC和Java的混合体吧,尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性。

飘灵儿 发表于 2015-3-15 22:23:44

大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。

第二个灵魂 发表于 2015-3-22 17:08:22

ASP.NET:ASP.net是Microsoft.net的一部分,作为战略产品,不仅仅是ActiveServerPage(ASP)的下一个版本;它还提供了一个统一的Web开发模型,其中包括开发人员生成企业级Web应用程序所需的各种服务。ASP.NET的语法在很大程度上与ASP兼容,同时它还提供一种新的编程模型和结构,可生成伸缩性和稳定性更好的应用程序,并提供更好的安全保护。

灵魂腐蚀 发表于 2015-3-22 17:08:22

ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp)。
页: [1]
查看完整版本: ASP.NET编程:ASP.NET中完成文件的回护性下载基本篇