浅谈asp.net Forms身份验证详解

在做网站的时候,都会用到用户登录的功能。对于一些敏感的资源,我们只希望被授权的用户才能够访问,这让然需要用户的身份验证。对于初学者,通常将用户登录信息存放在Session中,笔者在刚接触到asp.net的时候就是这么做的。当我将用户信息存在在Session中时,常常会遇到Session丢失导致用户无法正常访问被授权的资源,保持用户登录状态时的安全性问题,无休其实,在asp.net中,我们有更好的解决方案,那就是通过Forms身份验证,从而对用户进行授权,这种方法可以轻松的保持用户的登录状态(如果用户想这样),便捷的用户授权配置,增强的安全性等好处。废话不再多说,下面我们来做一个简单的用

在做例子之前,我们先定义如下用户类,类名为SampleUser,代码如下:

public partial class SampleUser { string username; public string UserName { get { return username; } set { username = value; } } string userpwd; public string UserPWD { get { return userpwd; } set { userpwd = value; } } public override bool Equals(object obj) { SampleUser other = obj as SampleUser; if (other == null || other.UserName != this.UserName) return false; return true; } } public partial class SampleUser { public static List<SampleUser> userList = new List<SampleUser> { new SampleUser() { UserName = "01", UserPWD = "123"}, new SampleUser() { UserName = "02", UserPWD = "123" }, new SampleUser() { UserName = "03", UserPWD = "123" }, new SampleUser() { UserName = "04", UserPWD = "123" }, }; public static SampleUser GetUser(string userName) { return userList.Find(u=>u.UserName == userName); } }

在类SampleUser中,定义了UserName和UserPWD两个字段,分别用来存储用户的登录名和密码信息。在SampleUser类的另一部分中,我们提供了一个用户的静态类表,用来代替存储在数据库中的用户信息,提供一个方法GetUser,用来获取用户信息。

在这个例子中,我们演示用户必须进行登录才能访问网站的资源,如果没有登录,则将用户导航到login.aspx页面中。

第一步,在web.config中添加配置信息,说明网站要使用Forms身份验证,并指定登录页面和默认登录成功后的跳转页面,然后指定拒绝未登录用户的访问,代码如下:

<authentication mode="Forms"> <forms loginUrl="~/Login.aspx" defaultUrl="~/Default.aspx" /> </authentication> <authorization> <deny users="?"/> </authorization>

完成这一步后,我们再打开Default.aspx页面,在没有登录的情况下,页面会被导航到Login.aspx页面,我们的第一步的目的已经达到了。

第二步,完成Login.aspx的页面逻辑。在页面中添加两个TextBox控件,用来输入用户名和密码;添加一个CheckBox控件,用来选择是否保持登录状态;添加一个Button控件,响应用户的登录操作。相应的代码如下:

<fieldset> <legend>用户登陆</legend> <div> 用户名:<asp:TextBox runat="server" /><br /><br /> 密&nbsp;&nbsp;&nbsp;码:<asp:TextBox runat="server" TextMode="Password" /><br /><br /> <asp:CheckBox runat="server" Checked="true" Text="保持登录状态" /> </div><br /> <asp:Literal Text="" runat="server" Visible="false" /> <br /> <p> <asp:Button Text="登陆" runat="server" /> </p> </fieldset>

接下来完成后台代码,添加登陆按钮的后台处理方法:对用户名和密码进行验证,如果验证通过,则为用户名创建一个身份验证票据,并将其添加到响应的Cookie中。代码如下:

protected void btnLogin_Click(object sender, EventArgs e) { string userID = this.txtUserID.Text.Trim(); string userPWD = this.txtUserPWD.Text.Trim(); SampleUser userEx = SampleUser.GetUser(userID); if (userEx == null) { ltMessage.Text = "用户不存在!"; ltMessage.Visible = true; return; } if (userEx.UserPWD != userPWD) { ltMessage.Text = "用户名或密码错误,请重新输入!"; ltMessage.Visible = true; return; } //添加票据,并将用户导航到默认页面 FormsAuthentication.RedirectFromLoginPage(userEx.UserName, this.cbSaveUserName.Checked); }

完成这一步后,我们就已经完成了简单Froms验证的功能。运行程序,你会发现,这里存在一个问题!!!

你发现了吗?当我们被导航到login.aspx时,这个页面的样式丢失了!这是因为我们对整个网站的资源进行了访问限制,如果没有登陆,用户不仅无法访问.aspx页面,甚至连css文件、js文件都无法访问。显然,这不是我们想要的,因为这些资源并不是敏感的资源。在通常情况下,我们只希望对部分文件夹中的文件进行验证访问限制,而不是整个网站,例如,我们允许只对User文件夹下的页面进行访问限制,因为这个文件夹中存放的是用户的私人信息,这些信息是敏感的。这该如何实现呢?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjywgd.html