今天偶然看了一篇关于Forms应用的文章收益颇多,写出来给大家分享。
说起对网站权限,记得以前做法是每个页面都进行判断,对webconfig 的使用少之又少今天说说webconfig 对网站权限的判断。
户文件夹(我们暂定user文件夹):只有用户登录以后才能访问。否则该访客只能访问user文件夹的登录页面(user_login.aspx)
管理员文件夹( 暂定admin文件夹):管理员文件夹不让任何人服务,当用户登录以后只能访问管理员登陆页(admin_login.aspx),管理员登陆后才能访问全部页面。
根目录:根目录可以让任何人访问。
目录结构如下:
第一步:
根目录下config代码:
<authentication mode="Forms">
<forms name="UserCookies" loginUrl="Default.aspx"></forms>
</authentication>
<authorization>
<allow users="*"/>
</authorization>
第二部:
Global.asax
头部添加
<%@ Import Namespace="System.Security.Principal" %>
void Application_AuthenticateRequest(object sender, EventArgs e)
{
if (HttpContext.Current.User != null)
{
//如果用户通过验证,则该项不为null
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
if (HttpContext.Current.User.Identity is FormsIdentity)
{
FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
FormsAuthenticationTicket ticket = id.Ticket;
string userData = ticket.UserData;//取出角色数据
string[] roles = userData.Split(',');
HttpContext.Current.User = new GenericPrincipal(id, roles);//重新分配角色
}
}
}
}
第三部:
admin文件夹config 文件
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings/>
<connectionStrings/>
<location path="admin_login.aspx">
<system.web>
<authorization>
<allow roles="user"/>
</authorization>
</system.web>
</location>
<system.web>
<authorization>
<allow roles="admin"/>
<deny users="*"/>
</authorization>
</system.web>
</configuration>
admin_login.aspx
cs 代码如下:
protected void Button1_Click(object sender, EventArgs e)
{
if (tbUserName.Text == "xiaomiao")
{
//生成验证票据,其中包括用户名、生效时间、过期时间、是否永久保存和用户数据等。而关于用户角色的信息,我们保存在用户数据中。
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, tbUserName.Text, DateTime.Now, DateTime.Now.AddMinutes(30), true, "Admin");
string cookieStr = FormsAuthentication.Encrypt(ticket);//对票据进行加密
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, cookieStr);
/*保存到cookie中。cookie的名字要与我们前面在配置文件中所写的name值一样。因为,当cookie保留在本地后,下次再检查用户权限的时候就会自动查找与forms名称相同的cookie,并传送给服务器端进行检验。如果在本地找不到cookie,就自然无法通过验证。*/
cookie.Expires = ticket.Expiration;
cookie.Path = FormsAuthentication.FormsCookiePath;
Response.Cookies.Add(cookie);
Response.Redirect("default.aspx");//登陆成功后跳转到index.aspx
}
}
第四步:
user文件夹config代码
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings/>
<connectionStrings/>
<location path="user_login.aspx">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
<system.web>
<authorization>
<allow roles="user,admin"/>
<deny users="*"/>
</authorization>
</system.web>
</configuration>
user_login.aspx
CS代码:
protected void Page_Load(object sender, EventArgs e)
{
//判断用户是否已经登陆,且角色为user
if (User.Identity.IsAuthenticated && User.IsInRole("user"))
{//如果通过验证,则直接跳转到index.aspx
Response.Redirect("default.aspx");
}
}
protected void Button1_Click(object sender, EventArgs e)
{
if (tbUserName.Text == "xiaomiao")
{
//生成验证票据,其中包括用户名、生效时间、过期时间、是否永久保存和用户数据等。而关于用户角色的信息,我们保存在用户数据中。
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, tbUserName.Text, DateTime.Now, DateTime.Now.AddMinutes(30), true, "User");
string cookieStr = FormsAuthentication.Encrypt(ticket);//对票据进行加密
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, cookieStr);
/*保存到cookie中。cookie的名字要与我们前面在配置文件中所写的name值一样。因为,当cookie保留在本地后,下次再检查用户权限的时候就会自动查找与forms名称相同的cookie,并传送给服务器端进行检验。如果在本地找不到cookie,就自然无法通过验证。*/
cookie.Expires = ticket.Expiration;
cookie.Path = FormsAuthentication.FormsCookiePath;
Response.Cookies.Add(cookie);
Response.Redirect("default.aspx");//登陆成功后跳转到index.aspx
}
}