基于窗体的验证是最为普遍的一种验证使用这种验证方式可以很方便灵活地应用到应用程序中窗体验证方式对基于用户的验证授权提供了很好的支持可以通过一个登录页面验证用户的身份将此用户的身份发回到客户端的Cookie之后此用户再访问这个web应用就会连同这个身份Cookie一起发送到服务端服务端上的授权设置就可以根据不同目录对不同用户的访问授权进行控制了
要采用窗体验证先要在应用程序根目录中的nfig中做相应的设置:
<authentication mode=forms>
<forms name=ASPXAUTH loginUrl=/Loginaspx timeout= path= />
</forms>
</authentication>
其中<authentication mode= Forms> 表示本应用程序采用Forms验证方式
()<Forms>标签中的name表示指定要用于身份验证的 HTTP Cookie默认情况下name 的值是 ASPXAUTH采用此种方式验证用户后以此用户的信息建立一个FormsAuthenticationTicket类型的身份验证票再加密序列化为一个字符串最后将这个字符串写到客户端的name指定名字的Cookie中一旦这个Cookie写到客户端后此用户再次访问这个web应用时会将连同Cookie一起发送到服务端服务端将会知道此用户是已经验证过的
再看一下身份验证票都包含哪些信息呢我们看一下FormsAuthenticationTicket类
CookiePath 返回发出 Cookie 的路径注意窗体的路径设置为 /由于窗体区分大小写这是为了防止站点中的 URL 的大小写不一致而采取的一种保护措施这在刷新 Cookie 时使用
Expiration 获取 Cookie 过期的日期/时间
IsPersistent 如果已发出持久的 Cookie则返回 true否则身份验证 Cookie 将限制在浏览器生命周期范围内
IssueDate 获取最初发出 Cookie 的日期/时间
Name 获取与身份验证 Cookie 关联的用户名
UserData 获取存储在 Cookie 中的应用程序定义字符串
Version 返回字节版本号供将来使用
() <Forms>标签中的loginUrl指定如果没有找到任何有效的身份验证Cookie为登录将请求重定向到的 URL默认值为 LoginaspxloginUrl指定的页面就是用来验证用户身份的一般此页面提供用户输入用户名和密码用户提交后由程序来根据自己的需要来验证用户的合法性(大多情况是将用户输入信息同数据库中的用户表进行比较)如果验证用户有效则生成同此用户对应的身份验证票写到客户端的 Cookie最后将浏览器重定向到用户初试请求的页面一般是用FormsAuthenticationRedirectFromLoginPage 方法来完成生成身份验证票写回客户端浏览器重定向等一系列的动作RedirectFromLoginPage 方法含有个参数函数定义如下
public static void RedirectFromLoginPage( string userName bool createPersistentCookie string strCookiePath )其中
userName 就是此用户的标示用来标志此用户的唯一标示不一定要映射到用户账户名称
createPersistentCookie标示是否发出持久的 Cookie若不是持久CookieCookie的有效期Expiration属性有当前时间加上nfig中timeout的时间每次请求页面时在验证身份过程中会判断是否过了有效期的一半要是的话更新一次cookie的有效期若是持久cookieExpiration属性无意义这时身份验证票的有效期有cookie的Expires决定RedirectFromLoginPage方法给Expires属性设定的是年有效期
strCookiePath标示将生成的Cookie的写到客户端的路径身份验证票中保存这个路径是在刷新身份验证票Cookie时使用(这也是生成Cookie的Path)若没有strCookiePath 参数则使用nfig中 path属性的设置
这里可以看到此方法参数只有三个而身份验证票的属性有七个不足的四个参数是这么来的
IssueDate Cookie发出时间由当前时间得出
Expiration过期时间由当前时间和下面要说的<Forms>标签中timeout参数算出此参数对非持久性cookie有意义
UserData 这个属性可以用应用程序写入一些用户定义的数据此方法没有用到这个属性只是简单的将此属性置为空字符串请注意此属性在后面我们将要使用到这个属性
Version 版本号由系统自动提供
RedirectFromLoginPage 方法生成生成身份验证票后会调用FormsAuthenticationEncrypt 方法将身份验证票加密为字符串这个字符串将会是以ASPXAUTH为名字的一个Cookie的值这个Cookie的其它属性的生成 DomainPath属性为确省值Expires视createPersistentCookie参数而定若是持久cookieExpires设为年以后过期若是非持久cookieExpires属性不设置
生成身份验证Cookie后将此Cookie加入到ResponseCookies中等待发送到客户端最后 RedirectFromLoginPage方法调用FormsAuthenticationGetRedirectUrl 方法获取到用户原先请求的页面重定向到这个页面
() <Forms>标签中的timeout和path是提供了身份验证票写入到Cookie过期时间和默认路径
经过上面的几步就完成了基于窗体身份验证的过程基于窗体的身份验证使用的时是非常灵活的 在实际应用中可以根据用户身份进行授权管理包括基于角色的用户权限管理等下面一节中我们来介绍基于Windows的身份验证
下面这个实例演示了如何利用窗体验证来实现ASPNET的安全控制的实例是在我们前面已经建立好的MyFirst应用程序中完成的该Web应用程序包含两个Web窗体一个是indexaspx代表默认主页一个是Loginaspx代表用户登录系统页面
首先是nfig配置文件如下
<?xml version= encoding=utf ?>
<configuration>
<systemweb>
<compilation defaultLanguage=vb debug=true />
<customErrors mode=RemoteOnly />
<authentication mode=Forms>
<forms name=ASPXAUTH loginUrl=Loginaspx timeout=></forms>
</authentication>
<authorization>
<deny users=admin />
<deny users=? />
</authorization>
<trace enabled=false requestLimit= pageOutput=false traceMode=SortByTime localOnly=true />
<sessionState
mode=InProc
stateConnectionString=tcpip=:
sqlConnectionString=data source=;Trusted_Connection=yes
cookieless=false
timeout=
/>
<globalization requestEncoding=utf responseEncoding=utf />
</systemweb>
</configuration>
Indexaspx的HTML代码如下
<%@ Page Language=vb AutoEventWireup=false Codebehind=indexaspxvb Inherits=MyFirstWebForm%>
<!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN>
<HTML>
<HEAD>
<title>基于Web窗体的身份验证实例</title>
<meta content=Microsoft Visual Studio NET name=GENERATOR>
<meta content=Visual Basic NET name=CODE_LANGUAGE>
<meta content=JavaScript name=vs_defaultClientScript>
<meta content= name=vs_targetSchema>
</HEAD>
<body MS_POSITIONING=GridLayout>
<form id=Form method=post runat=server>
<FONT face=宋体>
<asp:Button id=Button runat=server
Text=删除Cookies></asp:Button></FONT></form>
</body>
</HTML>