在 ASP.NET 中實現不同角色的使用者使用不同登入介面的方法
很多使用者在開發 ASP.NET 應用程式時都有這樣的需求:管理員角色的賬戶使用管理員的登入介面進行登入,普通使用者角色的賬戶使用普通使用者的登入介面進行登入。由於ASP.NET的 web.config裡只能使用一個 authentication mode="Forms" 節點,所以,要實現不同使用者採用不同的登入介面,一個辦法就是建立一個管理員專用的虛擬目錄,並設定為應用程式來實現。下面介紹另外一種採用重定向的辦法 來解決這個問題。
本文介紹的方法原理是根據登入介面的返回地址進行判斷,然後重定向到不同的頁面。下面就是實現的詳細過程。
1,建立一個網站,在網站裡建立Admin資料夾和User資料夾,分別存放admin和普通使用者所使用的檔案。也可以只設定一個 Admin
資料夾。由於本方法採用的判斷返回路徑的方法,所以,要能從路徑中區分出哪些是admin使用者使用的資料夾。當然,採用其他的判斷方法也是可以的。
2,在網站根目錄下分別建立3個登入檔案:Login.aspx、UserLogin.aspx和AdminLogin.aspx。其中Login.aspx檔案起地址轉換的作用,
Login.aspx檔案的主要內容:
{
String ReturnUrl = Request.QueryString["ReturnUrl"];
if (ReturnUrl == null || ReturnUrl.Equals(String.Empty))
{
//預設情況下,按普通使用者進行登入
Response.Redirect("~/UserLogin.aspx");
}
else
{
if (ReturnUrl.ToLower().Contains("/admin/"))
{
Response.Redirect("~/AdminLogin.aspx?ReturnUrl=" + Server.UrlEncode(ReturnUrl));
}
else
{
Response.Redirect("~/UserLogin.aspx?ReturnUrl=" + Server.UrlEncode(ReturnUrl));
}
}
}
UserLogin.aspx這個檔案的內容如下:
DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script. runat="server">
protected void Button1_Click(object sender, EventArgs e)
{
//密碼驗證過程在此省略,假如使用者名稱是mxh,密碼是mengxianhui
String UserName = "mxh";
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2,//票證的版本號
UserName,//與身分驗證票關聯的使用者名稱
DateTime.Now, //票證發出時的本地日期和時間
DateTime.Now.AddHours(1),//票證過期的本地日期和時間
true,// 如果票證儲存在永續性cookie中(跨瀏覽器會話儲存)則為 true 否則為false 如果票證儲存在URL中,將忽略此值
"reader",//儲存在票證中持定的使用者資訊,本頁面供 reader 登入使用
FormsAuthentication.FormsCookiePath //票證儲存在cookie中的路徑
);
//如果 forms 元素的 protection 屬性設定為 All 或 Encryption,則窗體身份驗證使用 Encrypt 方法對窗體身份驗證票進行加密和簽名。
string encTicket = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
Response.Cookies.Add(cookie);
Response.Redirect(FormsAuthentication.GetRedirectUrl(UserName, true));
}
script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>孟憲會之多使用者登入測試頁面title>
head>
<body>
<form. id="form1" runat="server">
普通使用者登入介面省略<br />
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="普通使用者登入" />
form>
body>
html>
AdminLogin.aspx這個檔案的全部內容如下:
DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script. runat="server">
protected void Button1_Click(object sender, EventArgs e)
{
//密碼驗證過程在此省略,假如使用者名稱是Admin,密碼是mengxianhui
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2,//票證的版本號
"Admin",//與身分驗證票關聯的使用者名稱
DateTime.Now, //票證發出時的本地日期和時間
DateTime.Now.AddHours(1),//票證過期的本地日期和時間
true,// 如果票證儲存在永續性cookie中(跨瀏覽器會話儲存)則為 true 否則為false 如果票證儲存在URL中,將忽略此值
"admin|manager|editor",//儲存在票證中持定的使用者資訊,本頁面供 admin,manager,editor登入使用
FormsAuthentication.FormsCookiePath //票證儲存在cookie中的路徑
);
//如果 forms 元素的 protection 屬性設定為 All 或 Encryption,則窗體身份驗證使用 Encrypt 方法對窗體身份驗證票進行加密和簽名。
string encTicket = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
Response.Cookies.Add(cookie);
Response.Redirect(FormsAuthentication.GetRedirectUrl("Admin", true));
}
script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>孟憲會之多使用者登入測試頁面title>
head>
<body>
<form. id="form1" runat="server">
管理員登入介面,省略
<asp:Button ID="Button1" runat="server" Text=" 登 錄 " OnClick="Button1_Click" />
form>
body>
html>
3,在Global的AuthenticateRequest 事件(一定要注意:不是 AuthorizeRequest 事件)裡將角色資訊附加到當前使用者的上下文中。
<script. RunAt="server">
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = Context.Request.Cookies[cookieName];
if (null == authCookie)
{
return;
}
FormsAuthenticationTicket authTicket = null;
try
{
authTicket = FormsAuthentication.Decrypt(authCookie.Value);
}
catch (Exception ex)
{
return;
}
if (null == authTicket)
{
return;
}
FormsIdentity id = new FormsIdentity(authTicket);
String[] roles = id.Ticket.UserData.Split('|'); //讀出在登入時設定的角色列表。
System.Security.Principal.GenericPrincipal principal = new System.Security.Principal.GenericPrincipal(id, roles);
Context.User = principal;//將驗證資訊附加到當前使用者上下文。
}
script>
4,在web.config檔案中,允許登入檔案的匿名訪問,以便在未登入的情況下顯示登入介面,注意:如果包含圖片、css等檔案,也需要設定這些資源允許匿名訪問。
<location path="AdminLogin.aspx">
<system.web>
<authorization>
<allow users="?"/>
authorization>
system.web>
location>
<location path="UserLogin.aspx">
<system.web>
<authorization>
<allow users="?"/>
authorization>
system.web>
location>
<system.web>
<authentication mode="Forms">
<forms loginUrl="Login.aspx" path="/" protection="Encryption">forms>
authentication>
<authorization>
<deny users="?"/>
<allow users="*"/>
authorization>
system.web>
configuration>
5,這樣,當訪問admin資料夾下的內容時,會直接轉到AdminLogin.aspx介面。在登入之後,就可以在/Admin/資料夾下的頁面中使用下面的方法得到當前登入的使用者名稱和所具有的角色,根據角色來判斷當前使用者是否有權操作:
Response.Write("
Response.Write("
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15723462/viewspace-625408/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 不同使用者登陸模組的實現
- linux下指定不同使用者登入不同目錄Linux
- 對不同角色使用者設定不同的系統首頁
- 使用impdp實現資料在不同使用者、不同例項之間快速複製
- Asp.net中防止使用者多次登入的方法ASP.NET
- FTP不同使用者登入同一個目錄FTP
- 【原創】不同RTOS中POSIX介面的實現差異
- LSM樹的不同實現介紹
- 不同團隊如何實現登入系統 (just for fun)
- 不同資料夾使用不同的Git使用者Git
- 不同使用者,不同的session超時時間Session
- 推送開發實戰:APP如何實現跟隨使用者不同場景,實現不同的內容推薦APP
- 修改不同IP的方法介紹!
- MongoDB 6.0 單例項基於使用者角色實現授權登入MongoDB單例
- 系統多種使用者角色認證登入授權如何實現?
- 用不同的庫實現模擬登陸知乎!
- Laravel 5.5 不同使用者表登入認證 (前後臺分離)Laravel
- 9.0.1.0.1 sqlplus登入(不同使用者)v$version居然不一樣 ?SQL
- 不同使用者,不同表空間遷移
- VSFTP針對不同的使用者限制不同的速度FTP
- 使用過載方法實現不同型別資料的計…型別
- Spring Boot應用中如何動態指定資料庫,實現不同使用者不同資料庫的場景Spring Boot資料庫
- 實現不同頁面不同頁首
- win10怎麼切換不同的登入賬戶_win10如何切換登入使用者Win10
- 在 PowerShell 中,可以透過以下幾種方法查詢使用者的上次登入時間。不同的方法適用於不同的情況,具體取決於你是要查詢本地計算機上的使用者資訊,還是要查詢 Active Directory 中的使用者資訊。計算機
- 在Linux中如何禁止使用者登入Linux
- asp.net 使用者角色管理ASP.NET
- 在Windows 11中解除安裝更新的不同方法Windows
- 在Java中建立物件的不同方法是什麼?Java物件
- Java Web實現使用者登入功能JavaWeb
- asp.net 根據值不同,在繫結時顯示不同顏色ASP.NET
- C# 實現http不同方法的請求C#HTTP
- asp.net mvc中的使用者登入驗證過濾器ASP.NETMVC過濾器
- iOS開發登入頁面的實現iOS
- springsecurity3 登入後在extjs中使用安全實體的資訊,不同頁面共享資料SpringGseJS
- [提問交流]如何實現所有使用者都需要註冊, 才能看到內容;並且不同組的使用者看到不同的文章?
- 不同資料型別在程式中的表現形式資料型別
- 實現多子型別輸入法:如何在 HarmonyOS中載入不同的輸入模式型別模式