您的位置:首页 > 编程语言 > ASP

实现Asp.net Forms身份验证的操作步骤

2008-02-22 15:15 741 查看
        

对于应用程序的身份验证,一直是自已编写登陆窗体,在窗体的CS文件中判断用户的登录是否合法,如果合法则将用户名保存在Cookie中。然后将所有页面的继承于一个类似BaseForm这样的基页面,在这个页面的Page_Load事件中加入判断,根据Cookie来判断用户是否已登录,如果没有登录则跳转到登录页面。
最近作一个互连网网站,想起安全性的问题,查阅了一些资料后觉得采用Asp.net提供的标准的Forms验证方式。研究了一下,现在写出操作步骤,以供以后使用的时候参考(博客现在的一个很重要的功能就是用来保存曾经的学习积累)

1、 修改web.config文件。如果vs2005的话,默认没有这个文件,调试时才会提示你是否要添加该文件。在web.config文件的<system.web>节中添加下面的三部分内容:

[align=left]<authentication mode="Forms">[/align]
[align=left]       <forms loginUrl="default.aspx" name=".ASPXFORMSAUTH">[/align]
[align=left]       </forms>[/align]
[align=left]     </authentication>[/align]
[align=left]     <authorization>[/align]
[align=left]       <deny users="?" />[/align]
[align=left]     </authorization>[/align]
[align=left]    <machineKey [/align]
[align=left]    validationKey="AutoGenerate,IsolateApps" [/align]
[align=left]    decryptionKey="AutoGenerate,IsolateApps"    [/align]
[align=left]    validation="SHA1" [/align]
[align=left]    decryption="Auto" />[/align]
[align=left][/align]
[align=left][/align]
[align=left]上面三部分分别标有不同颜色,第一部分是设定应用程序的身份验证模式,默认是windows,如果你的系统是在局域网内使用,并且整个局域网是工作在域模式下,那windows身份验证方式将会有很好的效果,如果多个B/S用windows模式来进行身份验证,那么他们甚至可以非常方便的就实现了单点登陆的效果。但Forms身份验证使用的更普遍些,虽然相对来说他存在安全性差的问题。在authentication节下有个forms节,在那里你可以填上执行你身份验证的页面,以及存储身份验证所采用的Cookie名称。如果你不填写Cookie名称的话,Asp.net默认分配.ASPXFORMSAUTH作为Cookie名称。[/align]
[align=left]    第二部分authorization是授权部分。你可以配置允许或拒绝某些用户或者角色来访问你的应用程序,他下面有deny,allow可以使用,搭配通配符?、*让我们可以非常轻易的配置出轻量级简单的身份验证体系。详细的配置信息可以参照asp.net的帮助文档,在此不在详细描述。[/align]
[align=left]    第三部分machineKey是用来配置存取Cookie时采用的加密/解密算法。有了这个算法后,Cookie应该算是比较安全了吧。[/align]
[align=left][/align]
[align=left][/align]
[align=left]2、 将Cookie信息登录后保存起来。[/align]
[align=left][/align]
[align=left]        FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1,CookieInfo, DateTime.Now, DateTime.Now.AddHours(20),false,UserData); // User data [/align]
[align=left]        string encryptedTicket = FormsAuthentication.Encrypt(authTicket); //加密 [/align]
[align=left]        //   存入Cookie [/align]
[align=left]        HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName,encryptedTicket);[/align]
[align=left]         authCookie.Expires = authTicket.Expiration;[/align]
[align=left][/align]
[align=left]         Response.Cookies.Add(authCookie); [/align]
[align=left][/align]
[align=left][/align]
[align=left]首先创建一个身份票据,身份票据主要保存用户的名称,Cookie的过期时间,另外你还可以保存一些额外数据,比如用户所扮演的角色。这里有个地方要注意,UserData是用来保存一些额外数据,比如角色,但如果我没有数据的话,通常会传一个null值进去,但如果你是想将Cookie信息进行加密保存的话,这里不能传null值,你可以传一个””值。如果传null值的话,在执行string encryptedTicket = FormsAuthentication.Encrypt(authTicket); 的时候会返回一个null值,以至于生成一个错误的加密Cookie值。如果要将Cookie进行长期保存,需要为Cookie设置一个过期时间。[/align]
[align=left][/align]
[align=left][/align]
[align=left]3、 读取保存在计算机中的Cookie。[/align]
[align=left]在Global.asax 文件中存在Application_AuthenticateRequest事件,它是执行所有服务器端请求的时候执行。因此我们可以在这个地方读取Cookie并进行解密。以下是示例代码:[/align]
[align=left][/align]
[align=left]protected void Application_AuthenticateRequest(object sender, EventArgs e)[/align]
[align=left]     {[/align]
[align=left]        string cookieName = FormsAuthentication.FormsCookieName;//从验证票据获取Cookie的名字。[/align]
[align=left][/align]
        //取得Cookie.
[align=left]        HttpCookie authCookie = Context.Request.Cookies[cookieName];[/align]
[align=left][/align]
[align=left]        if (null == authCookie)[/align]
[align=left]            return;[/align]
[align=left]        FormsAuthenticationTicket authTicket = null;[/align]
[align=left]        //获取验证票据。[/align]
[align=left]         authTicket = FormsAuthentication.Decrypt(authCookie.Value);[/align]
[align=left][/align]
[align=left]        if (null == authTicket)[/align]
[align=left]            return;[/align]
[align=left]       [/align]
[align=left]        //验证票据的UserData中存放的是用户角色信息。[/align]
[align=left]        //UserData本来存放用户自定义信息。此处用来存放用户角色。[/align]
[align=left]        string[] roles = authTicket.UserData.Split(new char[] { ',' });[/align]
[align=left]        FormsIdentity id = new FormsIdentity(authTicket);[/align]
[align=left]        GenericPrincipal principal = new GenericPrincipal(id, roles);[/align]
[align=left]        //把生成的验证票信息和角色信息赋给当前用户.[/align]
[align=left]         Context.User = principal;[/align]
[align=left]     }[/align]

当你对Cookie加密存储之后必须要进行解密后才能进行使用。
本文转自http://hi.baidu.com/tenss/blog/item/3df06c382f5cc12097ddd89b.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息