Asp.net的身份验证有有三种,分别是 "Windows | Forms | Passport ",其中又以Forms验证用的最多,也最灵活。
Forms 验证方式对基于用户的验证授权提供了很好的支持,可以通过一个登录页面验证用户的身份,将此用户的身份发回到客户端的Cookie,之后此用户再访问这个web应用就会连同这个身份Cookie一起发送到服务端。服务端上的授权设置就可以根据不同目录对不同用户的访问授权进行控制了。
它的原理是这样的:
首先对用户授权,比如不允许匿名访问等,然后对比web.config中配置的或者是数据库中的用户名和密码判断其合法性,合法后给其发验证成功的凭证,将用户信息保存到相应的cookie中,并添加到客户端,当二次访问的时候,客户端将用户信息和凭证一起发到服务器中,检验有了凭证就可以不用登陆了,否则就重定向到默认的登录页面。
它与传统的session+cookie使用最大的好处就是不用每页都判断用户是否存在,省了很多大量重复的代码
下面就来重点介绍一些Forms验证使用的几个简单步骤
首先需要在配置文件中配置信息,包括验证模式,授权等
<authentication mode="Forms">
<forms name ="Adminck" protection="All" loginUrl="login.aspx" defaultUrl="Default.aspx" path="/" timeout="60">
<credentials passwordFormat="Clear">
<user name="admin" password="admin"/>
<user name="shuang" password="shuang"/>
</credentials>
</forms>
</authentication>
首先将mode的验证方式从window改成Forms,forms中的name是用来保存验证信息的cookie的名称,默认为.aspxauth, protection是用户信息的处理方式,loginUrl当没验证通过或者没凭证的时候转到的页面,一般都是登录页面,defaultUrl是登录验证成功后默认进入的页面,path是cookie保存的路径,默认为”/” 这是因为大多数浏览器是区分大小写的,如果路径大小写不匹配,浏览器不会送回 Cookie。Timeout代表cookie过期的时间,黑色的部分是在web.config中储存了用户名和密码,如果你的用户名和密码是在数据库中存的,那么这段可以不用写
下面就要对用户进行授权了
<authorization>
<deny users="?"/> 拒绝匿名访问
<deny users="shuang"/> 拒绝shuang访问
<allow users="admin"/> 允许admin访问
</authorization>
如果你没授权,最起码是匿名访问不允许,那么Forms验证将不起作用
配置(web.config)中配置好这些以后,需要到登录页面对用户进行验证
protected void Button1_Click(object sender, EventArgs e)
{
string returnUrl = Request["ReturnUrl"];
if (FormsAuthentication.Authenticate(txtName.Text, txtpwd.Text))
{
System.Web.Security.FormsAuthentication.SetAuthCookie(txtName.Text, true);
Session["userName"] = txtName.Text;
if (returnUrl == null)
{
FormsAuthentication.RedirectFromLoginPage(txtName.Text, false);
}
else
{
Response.Redirect(returnUrl);
}
}
else
{
this.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('用户名或密码输入错误')</script>");
}
}
returnUrl:返回你访问的那个页面的url,如果存在,那么登录成功后可以直接进入改页面
if里验证的条件不一定是FormsAuthentication.Authenticate(txtName.Text, txtpwd.Text),这个是当用户存放到配置文件中的验证条件,如果是在数据量里,直接调用那个验证的方法就可以了,验证成功之后,就可以发用户凭证了:
System.Web.Security.FormsAuthentication.SetAuthCookie(txtName.Text, true);
可以结合session一起使用,用session保存一下用户的信息
Session["userName"] = txtName.Text;
然后判断returnUrl是否存在
if (returnUrl == null)
{
FormsAuthentication.RedirectFromLoginPage(txtName.Text, false);
}
else
{
Response.Redirect(returnUrl);
}
RedirectFromLoginPage:重定向到登录成功后默认的页面
这样基本就完成了Forms的验证,还有一下几点需要注意:
1、 web.config最好放到控制的目录下,比如一般在后台用的比较多,我们就直接把它放到admin下面就可以了
在根目录下面的web.config中我们可以放Forms验证的参数如:
<authentication mode="Forms">
<forms path="/" defaultUrl="~/admin/admin_index.aspx" loginUrl="~/admin/Login.aspx"
timeout="20" requireSSL="false" cookieless="UseDeviceProfile" name="hly8_com"
enableCrossAppRedirects="false"></forms>
</authentication>
admin下面的web.config用来授权就可以了
<!-- 这里配置,配置站点都要登录 -->
<authorization>
<deny users="?"/>
</authorization>
有的时候我们会发现有些文件或者图片访问不到,如图所示:
这是因为图片目录你也禁止了访问,在web.config中加上以下代码即可:
<location path="images">
<!--允许所有人访问这个页面-->
<system.web>
<authorization>
<allow users="?"/>
</authorization>
</system.web>
</location>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
2、 我们可以在其他的页面通过User.identity.name获得用户名,可以通过User.identity. RedirectFromLoginPage判断用户是否登录
3、 注销退出的时候,因为即使你清空了cookie转到了登录页面,但是因为页面是保存在客户端中,所以后退的时候还能退到最后的页面,这样是不行的,在这里我们可以这样写:
首先将凭证毁掉:FormsAuthentication.SignOut();
Response.Redirect(Request.Path);
4、 <authorization>
<allow users="admin"/>
<deny users="?"/>
<allow users="*"/>
</authorization>
一般顺序是这样的
这样就不会出现那种后退的问题了!也可以使用微软提供的注销控件
总之,这些东西要可以灵活使用!