愤怒的大鸟 发表于 2015-1-16 22:42:20

ASP.NET网站制作之ASP.NET 2.0 中的窗体身份考证

在VC.net的版本上,为了让C++运行在.NETFramework中,微软为C++引进了托管,就是托管C++(ManagedC++),这个根本就没有流行起来,自托管C++产生以后就没有收到过好评。asp.net  概述

  窗体身份考证利用用户登录到站点时创立的身份考证票,然后在全部站点内跟踪该用户。窗体身份考证票一般包括在一个Cookie中。但是,ASP.NET2.0版撑持无Cookie窗体身份考证,了局是将票证传进查询字符串中。

  假如用户哀求一个必要经由身份考证的会见的页,且该用户之前没有登录过该站点,则该用户重定向到一个设置好的登录页。该登录页提醒用户供应凭证(一般是用户名和暗码)。然后,将这些凭证传送给服务器并针对用户存储(如SQLServer数据库)举行考证。在ASP.NET2.0中,用户存储会见可由成员身份供应程序处置。对用户的凭证举行身份考证后,用户重定向到本来哀求的页面。

  窗体身份考证处置由FormsAuthenticationModule类完成,该类是一个介入惯例ASP.NET页处置轮回的HTTP模块。本文阐释ASP.NET2.0中窗体身份考证的事情机制。


  IIS身份考证

  ASP.NET身份考证分为两个步骤。起首,Internet信息服务(IIS)对用户举行身份考证,并创立一个Windows令牌来暗示该用户。IIS经由过程检察IIS元数据库设置,断定应当对特定使用程序利用的身份考证形式。假如IIS设置为利用匿名身份考证,则为IUSR_MACHINE帐户天生一个令牌并用它暗示匿名用户。然后,IIS将该令牌传送给ASP.NET。

  其次,ASP.NET实行本人的身份考证。所利用的身份考证办法由authentication元素的mode属性指定。以下身份考证设置指定ASP.NET利用FormsAuthenticationModule类:

<authenticationmode="Forms"/>

  注因为窗体身份考证不依附于IIS身份考证,因而假如要在ASP.NET使用程序中利用窗体身份考证,则应当在IIS中为使用程序设置匿名会见。

  ASP.NET窗体身份考证

  ASP.NET窗体身份考证在IIS身份考证完成后产生。可使用forms元素设置窗体身份考证。

  窗体身份考证设置

  以下设置文件片断显现窗体身份考证的默许属性值。


<system.web><authenticationmode="Forms"><formsloginUrl="Login.aspx"protection="All"timeout="30"name=".ASPXAUTH"path="/"requireSSL="false"slidingExpiration="true"defaultUrl="default.aspx"cookieless="UseDeviceProfile"enableCrossAppRedirects="false"/></authentication></system.web>  上面是对默许属性值的形貌:


loginUrl指向使用程序的自界说登录页。应当将登录页放在必要平安套接字层(SSL)的文件夹中。这有助于确保凭证从扫瞄器传到Web服务器时的完全性。

protection设置为All,以指定窗体身份考证票的保密性和完全性。这招致利用machineKey元素上指定的算法对身份考证票证举行加密,而且利用一样是machineKey元素上指定的哈希算法举行署名。

timeout用于指定窗体身份考证会话的无限保存期。默许值为30分钟。假如发表耐久的窗体身份考证Cookie,timeout属性还用于设置耐久Cookie的保存期。

name和path设置为使用程序的设置文件中界说的值。

requireSSL设置为false。该设置意味着身份考证Cookie可经由过程未经SSL加密的信道举行传输。假如忧虑会话夺取,招考虑将requireSSL设置为true。

slidingExpiration设置为true以实行变更的会话保存期。这意味着只需用户在站点上处于举动形态,会话超时就会按期重置。

defaultUrl设置为使用程序的Default.aspx页。

cookieless设置为UseDeviceProfile,以指定使用程序对一切撑持Cookie的扫瞄器都利用Cookie。假如不撑持Cookie的扫瞄器会见该站点,窗体身份考证在URL上打包身份考证票。

enableCrossAppRedirects设置为false,以指明窗体身份考证不撑持主动处置在使用程序之间传送的查询字符串上的票证和作为某个窗体POST的一部分传送的票证。
  受权设置

  在IIS中,对一切利用窗体身份考证的使用程序启用异步会见。UrlAuthorizationModule类用于匡助确保只要经由身份考证的用户才干会见页。

  可使用authorization元素设置UrlAuthorizationModule,如以下示例所示。

<system.web><authorization><denyusers="?"/></authorization></system.web>  利用该设置将回绝一切未经由身份考证的用户会见使用程序中的任何页。假如未经身份考证的用户试图会见某页,窗体身份考证模块将该用户重定向到forms元素的loginUrl属性指定的登录页。

  窗体身份考证把持流

  显现窗体身份考证时代呈现的事务按次。



图1.窗体身份考证把持流

用户哀求使用程序的假造目次下的Default.aspx文件。由于IIS元数据库中启用了匿名会见,因而IIS同意该哀求。ASP.NET确认authorization元素包含<denyusers="?"/>标志。

服务器查找一个身份考证Cookie。假如找不到该身份考证Cookie,则用户重定向到设置好的登录页(Login.aspx),该页由forms元素的LoginUrl属性。用户经由过程该窗体供应和提交凭证。有关肇端页的信息寄存在利用RETURNURL作为密钥的查询字符串中。服务器HTTP应对以下所示:
302FoundLocation:http://localhost/FormsAuthTest/login.aspx?RETURNURL=%2fFormAuthTest%2fDefault.aspx・
扫瞄器哀求Login.aspx页,并在查询字符串中包含RETURNURL参数。

服务器前往登录页和200OKHTTP形态代码。

用户在登录页输出凭证,并将该页(包含来自查询字符串的RETURNURL参数)发送回服务器。

服务器依据某个存储(如SQLServer数据库或ActiveDirectory用户存储)考证用户凭证。登录页中的代码创立一个包括为该会话设置的窗体身份考证票的Cookie。

在ASP.NET2.0中,能够经由过程成员身份体系实行对用户凭证的考证。Membership类为此供应了ValidateUser办法,以下所示:
if(Membership.ValidateUser(userName.Text,password.Text)){if(Request.QueryString["ReturnUrl"]!=null){FormsAuthentication.RedirectFromLoginPage(userName.Text,false);}else{FormsAuthentication.SetAuthCookie(userName.Text,false);}}else{Response.Write("InvalidUserIDandPassword");}
注利用LoginWeb服务器控件时,它主动为您实行以下步骤。下文利用了后面供应的代码。

关于经由身份考证的用户,服务器将扫瞄重视定向到查询字符串中的RETURNURL参数指定的原始URL。服务器HTTP应对以下所示:
302FoundLocation:http://localhost/TestSample/default.aspx・
重定向以后,扫瞄器再次哀求Default.aspx页。该哀求包含身份考证Cookie。

FormsAuthenticationModule类检测窗体身份考证Cookie并对用户举行身份考证。身份考证乐成后,FormsAuthenticationModule类利用有关经由身份考证的用户的信息添补以后的User属性(由HttpContext工具公然)。

因为服务器已考证了身份考证Cookie,因而它同意会见并前往Default.aspx页。

  FormsAuthenticationModule

  ASP.NET2.0在盘算机级Web.config文件中界说了一组HTTP模块,包含大批身份考证模块,以下所示:

<httpModules>...<addname="WindowsAuthentication"type="System.Web.Security.WindowsAuthenticationModule"/><addname="FormsAuthentication"type="System.Web.Security.FormsAuthenticationModule"/><addname="PassportAuthentication"type="System.Web.Security.PassportAuthenticationModule"/>...</httpModules>  每一个哀求只能利用一个身份考证模块。所利用的身份考证模块取决于authentication元素(一般位于使用程序的假造目次中的Web.config文件中)指定了哪一种身份考证形式。

  当Web.config文件中包括以下元素时,激活FormsAuthenticationModule类。

<authenticationmode="Forms"/>
  FormsAuthenticationModule类机关一个GenericPrincipal工具并将其存储在HTTP高低文中。GenericPrincipal工具保留对一个FormsIdentity实例的援用,该实例代表以后经由身份考证的用户。应当同意窗体身份考证为您办理这些义务。假如使用程序有特定请求(比方,将User属性设置为一个完成IPrincipal接口的自界说类),则该使用程序应当处置PostAuthenticate事务。FormsAuthenticationModule考证了窗体身份考证Cookie并创立了GenericPrincipal和FormsIdentity工具以后,会产生PostAuthenticate事务。在该代码中,能够机关一个包装FormsIdentity工具的自界说IPrincipal工具,然后将它存储在HttpContext.User属性中。

  注假如实行了这一操纵,还必要设置Thread.CurrentPrincipal属性上的IPrincipal援用,以确保HttpContext工具和该线程指向不异的身份考证信息。
  窗体身份考证Cookie

  挪用FormsAuthentication.SetAuthCookie或FormsAuthentication.RedirectFromLoginPage办法时,FormsAuthentication类主动创立身份考证Cookie。

  典范的窗体身份考证Cookie中包含以上司性:


Name。该属性指定Cookie的称号。

Value。该属性指定Cookie的值。

在典范的窗体身份考证Cookie中,该值包括一个经由加密和署名的FormsAuthenticationTicket工具的字符串暗示情势。该Cookie包括以上司性:

Expires。该属性指定Cookie的到期日期和工夫。仅今世码唆使应当发表一个耐久的窗体身份考证Cookie,窗体身份考证才设置该值。

Domain。该属性指定与Cookie联系关系的域。默许值为null。

HasKeys。该属性指出Cookie是不是有子项。
・HttpOnly。该属性指定是不是能够经由过程客户端剧本会见该Cookie。在ASP.NET2.0中,该值一直设置为true。InternetExplorer6ServicePack1撑持该Cookie属性,从而避免客户端剧本从document.cookie属性会见该Cookie。假如实验从客户端剧本会见该Cookie,则前往一个空字符串。不管什么时候用户扫瞄到以后域中的Web站点,该Cookie仍旧发送至服务器。
注不撑持HttpOnlyCookie属性的Web扫瞄器要末疏忽该Cookie,要末疏忽该属性,这意味着会话仍旧简单遭到跨站点剧本的打击。
・Path。该属性指定Cookie的假造路径。默许值为"/",代表根目次。
・Secure。该属性指出Cookie是不是应当仅经由过程HTTPS毗连传输。Secure属性应设置为true,以便该Cookie能够受SSL加密的回护。
・Version。该属性指定Cookie的版本号。

  创立身份考证Cookie

  经由过程FormsAuthentication类创立身份考证Cookie,以下所示。用户经由考证后,FormsAuthentication类在外部创立一个FormsAuthenticationTicket工具,办法是指定Cookie名、Cookie版本、目次路径、Cookie发表日期;Cookie到期日期、是不是应当保存Cookie,和用户界说的数据(可选)。

FormsAuthenticationTicketticket=newFormsAuthenticationTicket(1,"userName",DateTime.Now,DateTime.Now.AddMinutes(30),//valueoftimeoutpropertyfalse,//ValueofIsPersistentpropertyString.Empty,FormsAuthentication.FormsCookiePath);  接上去,假如forms元素的protection属性设置为All或Encryption,则窗体身份考证利用Encrypt办法对窗体身份考证票举行加密和署名。

stringencryptedTicket=FormsAuthentication.Encrypt(ticket);  以下文本显现了当protection属性设置为All时利用的历程:


创立序列化窗体身份考证票。创立票证的字节数组暗示情势。

对窗体身份考证票举行署名。字节数组的动静身份考证代码(MAC)的值,由利用machineKey元素的validation和validationKey属性指定的算法和密钥举行盘算。默许情形下,利用SHA1算法。

对窗体身份考证票举行加密。已创立的第二个字节数组利用FormsAuthentication类的Encrypt办法举行加密。该Encrypt办法在外部利用由machineKey元素上的decryption和decryptionKey属性指定的算法和密钥。ASP.NET1.1版在默许情形下利用3DES算法。ASP.NET2.0版在默许情形下利用Rinjdael(AES)算法。

依据必要创立HTTPCookie或查询字符串。然后,假如窗体身份考证针对cookieless身份考证举行了设置,则加密的身份考证票增加到HttpCookie工具。利用以下代码创立该Cookie工具:
HttpCookieauthCookie=newHttpCookie(FormsAuthentication.FormsCookieName,encryptedTicket);・
将窗体身份考证Cookie设置为平安的。假如窗体身份考证票设置为利用SSL,则HttpCookie.Secure属性设置为true。这标明扫瞄器仅经由过程HTTPS毗连发送Cookie。
authCookie.Secure=true;・
设置HttpOnly位。在ASP.NET2.0中,一直设置该位。

设置得当的Cookie属性。假如必要,设置Cookie的path、domain和expires属性。

将Cookie增加到Cookie汇合。将身份考证Cookie增加到要前往给客户端扫瞄器的Cookie汇合。
Response.Cookies.Add(authCookie);
  每次在身份考证以后吸收一个后续哀求时,FormsAuthenticationModule类城市从身份考证Cookie中检索身份考证票,对其举行解密,盘算哈希值,并对照该MAC值,以匡助确保该Cookie未被改动。最初,考证该窗体身份考证票中包括的到期工夫。

  注ASP.NET其实不依附于Cookie的到期日期,由于该工夫很简单假造。
  脚色受权

  在ASP.NET2.0中,脚色受权已失掉简化。对用户举行身份考证大概将脚色细节增加到身份考证Cookie时,不再必要检索脚色信息。.NETFramework2.0包含一个脚色办理API,它使您可以创立和删除脚色,将用户增加到脚色和从脚色删除用户。该脚色办理API将其数据存储在一个基本数据存储中,它经由过程针对该数据存储的得当脚色供应程序会见该存储。以下脚色供应程序为.NETFramework2.0附带,能够与窗体身份考证一同利用:


SQLServer。它是默许的供应程序,将脚色信息存储在SQLServer数据库。

受权办理器(AzMan)。该供应程序利用XML文件、ActiveDirectory或ActiveDirectory使用程序形式(ADAM)中的一个AzMan战略存储作为其脚色存储。它一般用于Intranet或Extranet计划中,个中Windows身份考证和ActiveDirectory用于举行身份考证。

  有关怎样利用脚色办理API的具体信息,请参阅HowTo:UseRoleManagerinASP.NET2.0。


  Cookieless窗体身份考证

  ASP.NET2.0撑持cookieless窗体身份考证。该功效由forms元素的cookieless属性把持。该属性能够设置为以下四个值之一:


UseCookies。该值强迫FormsAuthenticationModule类利用Cookie传输身份考证票。

UseUri。该值唆使FormsAuthenticationModule类重写URL来传输身份考证票。

UseDeviceProfile。该值唆使FormsAuthenticationModule类检察扫瞄器功效。假如扫瞄器撑持Cookie,则利用Cookie;不然,重写URL。

AutoDetect。该值经由过程一个静态检测机制唆使FormsAuthenticationModule类检测扫瞄器是不是撑持Cookie。假如检测逻辑标明不撑持Cookie,则重写URL。

  假如使用程序设置为利用cookieless窗体身份考证,而且正在利用FormsAuthentication.RedirectFromLoginPage办法,则FormsAuthenticationModule类主动设置URL中的窗体身份考证票。以下代码示例显现了典范URL在重写后的表面:

http://localhost/CookielessFormsAuthTest/(F(-k9DcsrIY4CAW81Rbju8KRnJ5o_gOQe0I1E_jNJLYm74izyOJK8GWdfoebgePJTEws0
_Pci7fHgTOUFTJe9jvgA2))/Test.aspx  括号中的URL部分包括Cookie一般将包括的数据。该数据在哀求处置过程当中由ASP.NET删除。该步骤由ASP.NETISAPI选择器实行,而不是在HttpModule类中实行。假如从一个.aspx页读取Request.Path属性,您在URL中不会看就任何分外的信息。假如重定向哀求,URL将主动重写。

  注难以包管URL中包括的身份考证票的平安。当平安性极其主要时,您应当利用Cookie存储身份考证票。

  成员身份和登录控件

  ASP.NET2.0引进了成员身份功效和一组登录Web服务器控件,它们简化了利用窗体身份考证的使用程序的完成。

  成员身份为使用程序用户供应凭证存储和办理。它还供应一个成员身份API,能够在利用窗体身份考证时简化用户凭证的考证义务。该成员身份功效构建于供应程序模子之上。该模子同意完成和设置指向分歧用户存储的分歧供应程序。ASP.NET2.0包含以下成员干系供应程序:


ActiveDirectory成员干系供应程序。该供应程序利用ActiveDirectory或ActiveDirectory使用程序形式(ADAM)用户存储。

SQLServer成员干系供应程序。该供应程序利用SQLServer用户存储。

  还能够增加对自界说用户存储的撑持。比方,能够增加对其他轻量级目次会见协定(LDAP)目次或其他现有大众标识存储的撑持。为此,创立一个从MembershipProvider笼统基类承继的自界说供应程序。

  ASP.NET登录控件主动利用成员身份和窗体身份考证,并封装提醒用户输出凭证,考证用户,恢复或交换暗码等所需的逻辑。实践上,ASP.NET登录控件在窗体身份考证和成员身份上供应一个笼统层,而且代替了您利用窗体身份考证时一般必需举行的年夜多半或全体事情。

  Web场计划

  在Web场中,没法确保哪一个服务器将处置一连哀求。假如用户在一台服务器上经由身份考证,但下一个哀求在另外一台服务器长进行,则身份考证票将招致考证失利并哀求用户从头举行身份考证。

  machineKey元素中的validationKey和decryptionKey属性用于对窗体身份考证票举行哈希操纵和加密。这些属性的默许值为AutoGenerate.IsolateApps。这些密钥是针对每一个使用程序主动天生的,在每台服务器上都分歧。因而,在一台盘算机上加密的身份考证票没法在Web场中的另外一台盘算机大概统一台Web服务器上的另外一个使用程序中举行解密和考证。

  为懂得决该成绩,Web场中一切盘算机上的validationKey和decryptionKey值都必需不异。有关设置machineKey元素的具体信息。
我以前很喜欢Serv-U,自从它用Java重写之后我就再也没用过,实在是太慢了,我宁可用IIS搭建FTP,虽然IIS搭建FTP在权限管理上很不灵活。

飘飘悠悠 发表于 2015-1-19 21:20:36

在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。

不帅 发表于 2015-2-4 09:09:57

当然我们在选择Asp.net主机是,除了要考虑服务提供商在版本是否是实时更新以外,机房的环境和配置也是非常重要的,通常选择骨干网的机房,在速度和稳定性上会非常有保证。

冷月葬花魂 发表于 2015-2-9 21:09:15

ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。

分手快乐 发表于 2015-2-27 21:29:58

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

愤怒的大鸟 发表于 2015-3-9 14:20:45

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

精灵巫婆 发表于 2015-3-16 23:38:20

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

第二个灵魂 发表于 2015-3-23 06:47:05

代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。
页: [1]
查看完整版本: ASP.NET网站制作之ASP.NET 2.0 中的窗体身份考证