Asp.net的身份验证有有三种,分别是"Windows | Forms | Passport",其中又以Forms验证用的最多,也最灵活。
Forms 验证方式对基于用户的验证授权提供了很好的支持,可以通过一个登录页面验证用户的身份,将此用户的身份发回到客户端的Cookie,之后此用户再访问这个 web应用就会连同这个身份Cookie一起发送到服务端。服务端上的授权设置就可以根据不同目录对不同用户的访问授权进行控制了
同时也支持角色进行控制。可以在web.config中进行配置,如果要使用forms进行身份验证的话,就需要在web.config中把<authentication mode="Windows"/>话语改成以下话语:
<authentication mode="Forms">
<forms name="auth" loginUrl="logon.aspx" timeout="30" protection="All" path="/" defaultUrl="User/register.aspx"></forms>
</authentication>
因为需要设置身份验证所以需要设置成不能使用匿名登录,设置如下:
<!--禁止匿名用户登录-->
<authorization>
<deny users="?"/>
</authorization>
上面设置完就说明你的网站是使用Forms身份验证了。
设置访问权限可以如下设置:
<!--设置目录访问权限 该目录下的url不允许匿名访问,不允许3这个用户登录-->
<location path="model">
<system.web>
<authorization>
<deny users="?"/>
<deny users="3"/>
</authorization>
</system.web>
</location>
<!--设置目录访问权限 匿名用户可以访问-->
<location path="User/register.aspx">
<system.web>
<authorization>
<allow users="?" />
</authorization>
</system.web>
</location>
<!--设置目录访问权限,设置单个页面的权限-->
<location path="visit.aspx">
<system.web>
<authorization>
<allow roles="admin" />
<deny users="*"/>
</authorization>
</system.web>
</location>
<system.web>
在登录页面写下如下代码:
protected void btnLogon_Click(object sender, EventArgs e)
{
string user = this.userName.Text; //读取用户名
// string password = TextBoxPassword.Text; //读取密码
if (Confirm(user, "") == true) //confirm方法用来验证用户合法性的
{
string userRoles = UserToRole(user); //调用UserToRole方法来获取role字符串
FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket(1, user, DateTime.Now, DateTime.Now.AddMinutes(30), false, userRoles, "/"); //建立身份验证票对象
string HashTicket = FormsAuthentication.Encrypt(Ticket); //加密序列化验证票为字符串
HttpCookie UserCookie = new HttpCookie(FormsAuthentication.FormsCookieName, HashTicket);
//生成Cookie
FormsAuthentication.SetAuthCookie(user, false); //输出Cookie
Response.Cookies.Add(UserCookie);//这个为了实现角色登录
Response.Redirect(FormsAuthentication.GetRedirectUrl(user, false)); // 重定向到用户申请的初始页面
}
else
{
// 用户身份未被确认时的代码
Response.Write("登录失败!");
}
}
分角色登录的话需要重写这个类RoleProvider
public override string[] GetRolesForUser(string username)
{
FormsIdentity Id = HttpContext.Current.User.Identity as FormsIdentity;
if (Id != null)
{
return Id.Ticket.UserData.Split(new Char[] { ',' });
}
return null;
}
还需要在web.config中写入如下配置:
<roleManager defaultProvider="MyRoleProvider"
enabled="true"
cacheRolesInCookie="true"
cookieName=".ASPROLES"
cookieTimeout="30"
cookiePath="/"
cookieRequireSSL="false"
cookieSlidingExpiration="true"
cookieProtection="All" >
<providers>
<clear />
<add name="MyRoleProvider"
type="MyRoleProvider"
writeExceptionsToEventLog="false" />
</providers>
</roleManager>