今天偶然看了一篇關於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
}
}