分享
 
 
 

ASP.Net:基于窗体的身份验证

王朝asp·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

基于窗体的验证是最为普遍的一种验证,使用这种验证方式可以很方便灵活地应用到应用程序中。窗体验证方式对基于用户的验证授权提供了很好的支持,可以通过一个登录页面验证用户的身份,将此用户的身份发回到客户端的Cookie,之后此用户再访问这个web应用就会连同这个身份Cookie一起发送到服务端。服务端上的授权设置就可以根据不同目录对不同用户的访问授权进行控制了。

要采用窗体验证,先要在应用程序根目录中的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" style="Z-INDEX: 101; LEFT: 112px; POSITION: absolute; TOP: 72px" runat="server"

Text="删除Cookies"></asp:Button></FONT></form>

</body>

</HTML>

Index.aspx.vb逻辑代码如下:

Imports System.Web

Imports System.Web.Security

Public Class WebForm2

Inherits System.Web.UI.Page

#Region " Web 窗体设计器生成的代码 "

'此处省略了窗体设计器身成的代码

#End Region

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'在此处放置初始化页的用户代码

Response.Write("欢迎访问本页面,你已经成功登录系统!")

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

'清除Cookies信息

FormsAuthentication.SignOut()

End Sub

End Class

Login.aspx的HTML代码如下:

<%@ Page Language="vb" AutoEventWireup="false" Codebehind="

[1] [2] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有