`
isiqi
  • 浏览: 16359668 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

ASP.Net 2.0窗体身份验证机制详解(FormsAuthentication)

阅读更多

本篇文章介绍了在ASP.Net 2.0如何做窗体身份验证,并且讲解了IISASP.Net2.0窗体身份验证机制是如何结合在一起的。我们还会详细讲解一下2.0中关于窗体身份验证的一个类:FormsAuthenticationModule

l 综述

当某一个用户使用用户名成功登陆网站时,FormsAuthentication(窗体身份验证机制,下面统一使用英文术语) 将会创建一个authentication ticket (身份验证票),通过这个ticket就可以在网站上全程跟踪这个用户了。Form authentication ticket通常被包含在一个Cookie里面,但是Asp.net2.0也支持不使用CookieFormsAuthentication这时候ticket就需要通过Query string 传递。

当一个用户在登陆某个网站时,需要提供身份验证才能进入网站。如果他还没有输入验证信息(通常是用户名和密码),则此用户将会被重定向到一个登陆页面。用户可以在登陆页面输入验证信息,然后这些信息被发送到服务器与某一个存储用户身份信息的介质(例如Sql Server或者某个文件)进行信息对比。在ASP.Net2.0中,可以通过MemberShip Proivder来访问存储在诸如Sqlserver的信息。(Provider模式有很多优点,稍后会有文章详细说明。)当用户信息通过验证后,此用户将获得允许,访问他所期望的页面。

FormsAuthentication通过FormsAuthenticationModule这个类来执行,这个类是ASP.net页面运行周期的一部分。以下我们将解释FormsAuthenticationASP.net2.0中是如何工作的。

l IIS 验证

Asp.net验证分为两步。首先,IIS验证当前用户访问网站所使用的windows帐号是否有权限。如果IIS访问被配置为anonymous则任何用户都能访问页面。

然后,在IIS验证完毕后,ASP.net开始执行自身的验证。验证模式可以在web.config文件中配置,只要在config文件中写上<authentication mode="Forms" />,那么ASP.net就知道使用FormsAuthenticationModule 类进行验证。

l Asp.Net Froms Authentication

Froms Authentication 配置:你可以在config文件中配置。配置如下:

<system.web>

<authentication mode="Forms">

<forms loginUrl="Login.aspx"

protection="All"

timeout="30"

name=".ASPXAUTH"

path="/"

requireSSL="false"

slidingExpiration="true"

defaultUrl="default.aspx"

cookieless="UseDeviceProfile" enableCrossAppRedirects="false" />

</authentication>

</system.web>

这些属性详细描述如下:

loginUrl:指向登陆页面,你应改把登陆页面放在一个需要Secure Sockets Layer (SSL)的文件夹里。这样才能保障帐号的安全和完整。

potection:设置为ALL表明authentication ticket是加密的,加密算法被定义在machineKey这个元素中,并且通过哈希算法进行签名,这个算法也定义在machineKey中。

timout该属性定义了验证session的过期时间。默认值为30分钟。

RequireSSL:该属性被设置为false,这表明验证的cookies可以不同过SSL加密传输。如果对session的安全性特别重视的话,则需要设置为true

slidingExpiration:该属性被设置为true,这表示用户只要在网站上持续保持活动,则session就不会过期。

DefaultUrl:该属性表示登陆后的默认页面。

Cookieless该属性被设置为UseDeviceProfile,这表示cookie将在任何支持它的浏览器中使用,如果该浏览器不支持cookie的话,form authentication将通过url来传递authentication ticket

enableCrossAppRedirects:该属性表示是否可以将通过身份验证的用户重定向到其他web应用程序。True表示可以,False表示不可以。


l Authorization Configuration(用户配置)

UrlAuthorizationModule用来执行保障只有通过身份验证的用户才能访问页面。你可以在web.config文件中配置这个类:配置如下:
<
ystem.web>

<authorization>

<deny users="?" />

</authorization>

</system.web>

以上配置表明,没有通过验证的用户都将被拒绝访问页面。如果一个没有验证的用户试图访问页面,他将会被重定向到loginUrl属性定义的登陆页面上。


l Forms Authentication 控制流程

Forms Authentication的流程可以参考下图:
<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 345.75pt; HEIGHT: 311.25pt" type="#_x0000_t75"><imagedata src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.png" o:title="{38EF49C2-A753-48FD-A046-EDBEC4F2498F}"></imagedata></shape>

我们来分析一下上面的流程:

第一步:用户访问default.aspx页面,IIS通过了验证,ASP.Net发现 authorization

元素中包含<deny users="?" />的标签。

第二步:服务器寻找包含验证信息的cookie,如果没有找到这个cookie,用户将被重定向到登陆页面。就是loginurl所指定的页面。用户将在那个页面输入登陆信息。:

第三步:浏览器请求浏览登录页面,同时传递ReturnUrl的参数的值。

第四步:服务器调转到登陆页面。

第五步:用户输入身份验证信息,并且提交数据,其中还包含ReturnUrl的参数值。

第六部:服务器通过读取存储介质(例如sqserver数据库)验证用户的信息。登陆页面将创建一个包含form authentication ticketcookie作为session

Asp.net2.0身份验证可以通过membership系统。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("Invalid UserID and Password");

}

第七步:用户验证成功,服务器重新让浏览器指向ReturUrl所指定的页面。

第八步:在重定向的同时,浏览器向default.aspx页面发送request请求,此次请求包含用户的forms authentication cookie

第九步:FormsAuthenticationModule类侦测到forms authentication cookie并且开始验证,验证成功后,该类将得到当前的用户信息,并传送给HttpContext对象。可以通过HttpContext对象获得当前用户的信息。

10步:验证成功,来去自如哦!

l FormsAuthenticationModule

ASP.Net 2.0在系统默认的web.config文件中定义了一系列的Http模块(Http Modules).其中包括了一系列的验证模块如下:

<httpModules>

...

<add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule" />

<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" />

<add name="PassportAuthentication" type="System.Web.Security.PassportAuthenticationModule" /> ... </httpModules>

在每一次请求时,只能使用一种验证模块。通常验证模式会被定义在web.config文件中:

<authentication mode="Forms" />这句话表示使用FormsAuthentication

FormsAuthenticationModule类会创建一个GenericPrincipal的对象,然后把它存入Http Context中。GenericPrincipal包含一个FormsIdentity的实例的引用,FormsIdentity实例包含了用户的信息。一般你会通过forms authentication来替你完成以上工作。但是如果你的程序还有别的特殊要求,比如把用户信息传递给一个自定义的类(该类继承IPrincipal接口),你的程序需要在PostAuthenticate Event事件中编写代码。PostAuthenticate Event事件会在 FormsAuthenticationModule验证forms authentication cookie 并且创建完GenericPrincipalFormsIdentity对象后触发,在该事件触发后,你可以在事件中创建自定义的IPrincipal对象,用此对象封装FormsIdentity对象,然后把自定义的IPrincipal对象存入HttpContext中。

注意:如果自定义IPricipal对象,你必须在当前线程中设置自定义对象的引用:例如:Thread.CurrentPrincipal=newGenericPrincipal(new GenericIdentity( "Bob", "Passport"), rolesArray);

这样才能保证HttpContext对象和线程指向同一个验证用户的信息。

l Forms Authentication Cookies

FormsAuthentication类在调用FormsAuthentication.SetAuthCookie或者FormsAuthentication.RedirectFromLoginPage的方法后会自动创建验证Cookie;

一个典型的验证cookie包含以下两个属性:

NameCookie的名称

Value:Cookie的值

在一个典型的forms authentication cookie中,cookie的值是加密的,并且创建一个FormAuthenticationTicket的签名。Cookie包含以下属性:

Expires此属性标识cookie的过期时间,当用户需要把cookie保存在本地电脑上时,需要设置此属性。

Domain:这个属性表明cookie和哪个域相关联,默认的值为null

HasKeys这个属性表明cookie是否有子键。

HttpOnly: 这个属性表示cookie是否能被客户端脚本读取,.net2.0中,这个设置始终为true;但在客户端浏览器中,只有IE6.0才能识别这个属性。

Path:这个属性表明cookie的虚拟目录。默认的值为”/”,表示站点根目录。

Secure:这个属性表明cookie是否需要加密。如果设置true,cookie将接受SSL加密

Version:这个属性表明cookie的版本号

l 创建Forms Authentication Cookies

当某个用户验证通过后,Forms Authentication Cookies会被Forms Authentication类在内部自动创建。创建的就是一个FormsAuthenticationTicket类。创建此类的代码如下:

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,

"userName",

DateTime.Now,

DateTime.Now.AddMinutes(30), // value of time out property false, // Value of IsPersistent property

String.Empty,

FormsAuthentication.FormsCookiePath);

然后如果在web.config文件中,forms元素的protection属性被设置成ALL

或者Encryption,将对ticket对象进行加密并且创建签名。加密代码如下:

string encryptedTicket = FormsAuthentication.Encrypt(ticket);

下面将简要介绍一下当protection属性被设置为true时的流程:

n 创建一个序列化的forms authentication ticket即创建此对象为一个字节数组(byte array

n 创建forms authentication ticket的签名。machineKey中的validationalidationKey的属性所设置了生成签名的算法。我们用此算法计算上面序列化的bytearray,生成MACmessage authentication code)。在默认的选择中,系统使用的是SHA1的算法。

n 加密forms authentication ticket同时我们将创建另外一个序列化的对象,此对象经过加密算法加密。这个加密算法也可在machineKey中的decryptiondecryptionKey的属性中获得。在asp.net 1.1中使用的是3DES加密,而在asp.net2.0中,使用的是AES加密算法。

n 创建HttpCookie对象或者生成cookiequery string(在不支持cookie时,我们只能生成Query String.HttpCookie 对象创建方法代码如下:

HttpCookie authCookie = new HttpCookie(

FormsAuthentication.FormsCookieName,

encryptedTicket);

加密后的ticket就被添加到了HttpCookie对象中。

n 设置forms authentication cookie为安全的。如果forms authentication ticket被配置成为使用SSL,那么HttpCookie. Secure的属性也必须设置成true.在这种情况下,浏览器只能通过HTTPS协议传送Cookies.

n 设置HttpOnly bitasp.net2.0,这个属性默认设置完成。

n 设置当前cookie的属性。如果需要,可以设置当前cookiepath, domain andexpires属性

n 添加cookiecookiecollection,传给客户端。Response.Cookies.Add(authCookie);

每当authentication收到一个请求,FormsAuthenticationModule从客户端Cookie获得一个authentication ticket然后解码,计算哈希值比对MAC值,这样就确认了cookie没有被人为伪造。最后验证ticket包含的过期时间。

ASP.NET 并不依赖于 Cookie 的到期日期,因为该时间很容易伪造。


l 角色授权(Role Authorization)

ASP.NET 2.0 中,角色授权已经得到简化。对用户进行身份验证或者将角色细节添加到身份验证 Cookie 时,不再需要检索角色信息。.NET Framework 2.0 包括一个角色管理 API,它使您能够创建和删除角色,将用户添加到角色以及从角色删除用户。该角色管理 API 将其数据存储在一个基础数据存储中,它通过针对该数据存储的适当角色提供程序访问该存储。以下角色提供程序为 .NET Framework 2.0 附带,可以与窗体身份验证一起使用:


• SQL Server
。它是默认的提供程序,将角色信息存储在 SQL Server 数据库。
授权管理器 (AzMan)。该提供程序使用 XML 文件、Active Directory Active Directory 应用程序模式 (ADAM) 中的一个 AzMan 策略存储作为其角色存储。它通常用于 Intranet Extranet 方案中,其中 Windows 身份验证和 Active Directory 用于进行身份验证。

How To: Use Role Manager in ASP.NET 2.0.

l Cookieless窗体验证
ASP.NET 2.0
支持 cookieless 窗体身份验证。该功能由 forms 元素的 cookieless 属性控制。该属性可以设置为以下四个值之一:</

分享到:
评论

相关推荐

    【ASP.NET编程知识】ASP.NET窗体身份验证详解.docx

    ASP.NET 窗体身份验证详解 ASP.NET 窗体身份验证是 ASP.NET 中的一种身份验证机制,它可以帮助开发者保护网站的安全性并防止未经授权的访问。窗体身份验证是 ASP.NET 提供的一种身份验证类型,其他类型包括 Windows...

    asp.net中的窗体身份验证

    在ASP.NET中,窗体身份验证(Forms Authentication)是一种非常实用的身份验证机制,它允许开发人员自定义用户登录逻辑并存储登录状态,而不需要依赖于Windows集成安全认证或其他第三方服务。本文将详细介绍ASP.NET...

    ASP.NET窗体身份验证详解

    ***窗体身份验证是一种用于Web应用程序的身份验证机制,它通过表单提交用户凭证来实现。这种方式允许用户通过一个登录界面提交用户名和密码,系统将进行验证,如果验证通过,用户的身份信息将会保存在一个或多个...

    ASP.NET配置文件Web.config详解

    作用:配置 ASP.NET 身份验证支持(为 Windows、Forms、PassPort、None 四种)。该元素只能在计算机、站点或应用程序级别声明。&lt;authentication&gt; 元素必需与&lt;authorization&gt; 节配合使用。 示例:基于窗体(Forms)...

    基于asp.net新闻系统web窗体

    4. 用户认证和授权:利用ASP.NET的身份验证和授权机制,如Forms Authentication,控制用户访问权限。 5. Razor视图引擎:用于生成HTML响应,简化视图层的代码编写。 6. 数据绑定和控件:如GridView、DetailsView等,...

    【ASP.NET编程知识】ASP.NET配置文件Web.config用法详解.docx

    &lt;authentication&gt; 节的作用是配置 ASP.NET 身份验证支持(为 Windows、Forms、PassPort、None 四种)。该元素只能在计算机、站点或应用程序级别声明。&lt;authentication&gt; 元素必需与&lt;authorization&gt; 节配合使用。 ...

    ASP.NET +ACCESS企业网站完全无限制版

    1. 用户身份验证与授权:ASP.NET提供内置的身份验证和授权机制,如Forms Authentication和Role-Based Authorization,可以轻松管理用户登录、权限控制等功能。 2. 数据展示:使用ASP.NET控件(如GridView、...

    校友录系统(ASP.NET 3.5实现)

    - **用户认证与授权**:使用ASP.NET的Forms Authentication进行用户身份验证,结合角色管理实现不同权限的校友访问控制。 - **数据库设计**:设计合理的数据库模式,包含用户表、班级表、留言表等,确保数据的一致...

    asp.net与extjs开发点卡在线销售系统(0520_).rar

    同时,为了确保交易的安全性,系统需要采用HTTPS协议,ASP.NET的Forms Authentication和Role Management功能可以用来实现用户身份验证和权限控制。 EXTJS在前端的运用主要体现在以下几个方面: 1. **用户界面**:...

    ASP.net Forms验证Demo第1/3页

    ### ASP.NET Forms 验证与角色验证授权详解 #### 一、引言 在Web开发领域,特别是使用ASP.NET框架进行开发时,安全性是至关重要的一个方面。ASP.NET提供了多种安全验证机制,其中Forms验证是一种非常实用且灵活的...

    VS2008+SQL登陆注册系统

    VS2008支持ASP.NET的身份验证和授权机制,可以实现基本的身份验证(如Forms Authentication)来保护应用程序。密码通常需要通过哈希算法(如SHA256)加密存储,防止明文泄露。 4. **注册流程**:用户注册时,系统...

    C#写的一个很清新的留言板,有原项目

    为了确保只有合法用户可以发表留言,系统可能包含了身份验证机制,如Forms Authentication或OAuth。此外,权限管理也可能被考虑,如管理员可以删除不当留言,而普通用户只能查看和回复。 6. **视图模型与数据绑定*...

    详解ASP.NET配置文件Web.config

    &lt;authentication&gt;节用于配置***支持的身份验证方式,包括Windows、Forms、PassPort和None四种模式。此元素通常在计算机、站点或应用程序级别声明,并且必须与节配合使用。例如,基于窗体的身份验证配置将未登录用户...

    网页修改域用户密码

    Web.config文件是ASP.NET应用程序的配置文件,其中包含了应用程序的设置,比如数据库连接字符串、身份验证和授权规则等,这在实现网页密码修改功能时是至关重要的。 三、Web.config详解 Web.config文件的配置部分...

Global site tag (gtag.js) - Google Analytics