要采用窗体验证,先要在应用程序根目录中的web.config中做相应的设置:
<authentication mode="forms">
<forms name=".aspxauth " loginurl="/login.aspx" timeout="30" path= "/">
</forms>
</authentication>
其中<authentication mode= "forms"> 表示本应用程序采用forms验证方式。
(1)<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: 返回字节版本号供将来使用。
(2) <forms>标签中的loginurl指定如果没有找到任何有效的身份验证cookie,为登录将请求重定向到的 url。默认值为 login.aspx。loginurl指定的页面就是用来验证用户身份的,一般此页面提供用户输入用户名和密码,用户提交后由程序来根据自己的需要来验证用户的合法性(大多情况是将用户输入信息同数据库中的用户表进行比较),如果验证用户有效,则生成同此用户对应的身份验证票,写到客户端的cookie,最后将浏览器重定向到用户初试请求的页面,一般是用formsauthentication.redirectfromloginpage 方法来完成生成身份验证票,写回客户端,浏览器重定向等一系列的动作。redirectfromloginpage 方法含有3个参数,函数定义如下:
public static void redirectfromloginpage( string username, bool createpersistentcookie, string strcookiepath )
其中:
username: 就是此用户的标示,用来标志此用户的唯一标示,不一定要映射到用户账户名称;
createpersistentcookie: 标示是否发出持久的 cookie。若不是持久cookie,cookie的有效期expiration属性有当前时间加上web.config中timeout的时间,每次请求页面时,在验证身份过程中,会判断是否过了有效期的一半,要是的话更新一次cookie的有效期;若是持久cookie,expiration属性无意义,这时身份验证票的有效期有cookie的expires决定,redirectfromloginpage方法给expires属性设定的是50年有效期;
strcookiepath: 标示将生成的cookie的写到客户端的路径,身份验证票中保存这个路径是在刷新身份验证票cookie时使用(这也是生成cookie的path),若没有strcookiepath 参数,则使用web.config中 path属性的设置。
这里可以看到,此方法参数只有三个,而身份验证票的属性有七个,不足的四个参数是这么来的:
issuedate: cookie发出时间由当前时间得出;
expiration:过期时间由当前时间和下面要说的<forms>标签中timeout参数算出。此参数对非持久性cookie有意义;
userdata: 这个属性可以用应用程序写入一些用户定义的数据,此方法没有用到这个属性,只是简单的将此属性置为空字符串,请注意此属性,在后面我们将要使用到这个属性;
version: 版本号由系统自动提供。
redirectfromloginpage方法生成生成身份验证票后,会调用formsauthentication.encrypt 方法,将身份验证票加密为字符串,这个字符串将会是以.aspxauth为名字的一个cookie的值。这个cookie的其它属性的生成:domain,path属性为确省值,expires视createpersistentcookie参数而定,若是持久cookie,expires设为50年以后过期;若是非持久cookie,expires属性不设置。
生成身份验证cookie后,将此cookie加入到response.cookies中,等待发送到客户端。
最后redirectfromloginpage方法调用formsauthentication.getredirecturl 方法获取到用户原先请求的页面,重定向到这个页面。
(3) <forms>标签中的timeout和path,是提供了身份验证票写入到cookie过期时间和默认路径。
经过上面的几步,就完成了基于窗体身份验证的过程。基于窗体的身份验证使用的时是非常灵活的 ,在实际应用中可以根据用户身份进行授权管理,包括基于角色的用户权限管理等。下面一节中,我们来介绍基于windows的身份验证。
下面这个实例演示了如何利用窗体验证来实现asp.net的安全控制的。实例是在我们前面已经建立好的myfirst应用程序中完成的,该web应用程序包含两个web窗体,一个是index.aspx,代表默认主页,一个是login.aspx,代表用户登录系统页面。
首先是web.config配置文件,如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation defaultlanguage="vb" debug="true" />
<customerrors mode="remoteonly" />
<authentication mode="forms">
<forms name=".aspxauth" loginurl="login.aspx" timeout="30"></forms>
</authentication>
<authorization>
<deny users="admin2" />
<deny users="?" />
</authorization>
<trace enabled="false" requestlimit="10" pageoutput="false" tracemode="sortbytime" localonly="true" />
<sessionstate
mode="inproc"
stateconnectionstring="tcpip=127.0.0.1:42424"
sqlconnectionstring="data source=127.0.0.1;trusted_connection=yes"
cookieless="false"
timeout="20"
/>
<globalization requestencoding="utf-8" responseencoding="utf-8" />
</system.web>
</configuration>
index.aspx的html代码如下:
<%@ page language="vb" autoeventwireup="false" codebehind="index.aspx.vb" inherits="myfirst.webform2"%>
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>基于web窗体的身份验证实例</title>
<meta content="microsoft visual studio .net 7.1" name="generator">
<meta content="visual basic .net 7.1" name="code_language">
<meta content="javascript" name="vs_defaultclientscript">
<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetschema">
</head>
<body ms_positioning="gridlayout">
<form id="form1" method="post" runat="server">
<font face="宋体">
<asp:button id="button1" runat="server"
text="删除cookies"></asp:button></font></form>
</body>
</html>
新闻热点
疑难解答
图片精选