成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ASP.NET安全認(rèn)證機(jī)制基于角色窗體的實(shí)現(xiàn)

開(kāi)發(fā) 后端
本文試圖通過(guò)一些例子來(lái)說(shuō)明如何實(shí)現(xiàn)基于角色窗體的ASP.NET安全認(rèn)證機(jī)制,展示ASP.NET中窗體認(rèn)證強(qiáng)大的功能特性。

簡(jiǎn)介:

ASP.NET 中窗體認(rèn)證是一個(gè)功能非常強(qiáng)大的特性,只需要很少的代碼就可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的平臺(tái)無(wú)關(guān)的ASP.NET安全認(rèn)證機(jī)制。 但是,如果你需要一個(gè)更復(fù)雜更有效的認(rèn)證機(jī)制,那么你就要把眾多用戶(hù)分成用戶(hù)群組,以利用它的靈活性。

Windows 集成認(rèn)證提供了這種認(rèn)證機(jī)制,但它使用的是 NTLM,即Windows NT LAN Manager,因而它不是跨平臺(tái)的。現(xiàn)在越來(lái)越多的人使用 Linux 系統(tǒng),而 Mozilla Forefox 瀏覽器用戶(hù)也越來(lái)越多,我們肯定不能把這些人拒之門(mén)外,因此我們尋求另外的ASP.NET安全認(rèn)證機(jī)制。有兩個(gè)選擇:

一是為網(wǎng)站劃分多個(gè)區(qū)域,提供多個(gè)登錄頁(yè)面,強(qiáng)迫用戶(hù)一個(gè)一個(gè)的去注冊(cè)和登錄;

二是把用戶(hù)分組,并且限制特定用戶(hù)組對(duì)某頁(yè)面或者某區(qū)域訪(fǎng)問(wèn)的權(quán)限。

后者當(dāng)然是更好的選擇。通過(guò)分配角色給各個(gè)用戶(hù),我們能夠?qū)崿F(xiàn)這種功能。

微軟為.NET平臺(tái)留下了窗體認(rèn)證中基于角色的認(rèn)證機(jī)制,但是我們必須自己去實(shí)現(xiàn)它。本文力求覆蓋窗體認(rèn)證中基于角色的認(rèn)證機(jī)制的一些基本的東西,比如它的概念,它的實(shí)現(xiàn),如何在Web應(yīng)用程序中應(yīng)用等。

必要準(zhǔn)備:

我們首先要建立一個(gè)數(shù)據(jù)庫(kù),一個(gè)Web應(yīng)用項(xiàng)目,幾個(gè)不同安全級(jí)別的機(jī)密目錄,以及幾個(gè)ASP.NET頁(yè)面。當(dāng)然你也可以在你現(xiàn)有的Web應(yīng)用項(xiàng)目中添加這些。

1、創(chuàng)建數(shù)據(jù)庫(kù)

首先要選擇你需要使用的數(shù)據(jù)庫(kù)管理系統(tǒng) DBMS。本文使用 SQL Server 2000。

在實(shí)際應(yīng)用項(xiàng)目的數(shù)據(jù)庫(kù)中,一般都會(huì)有用戶(hù)數(shù)據(jù)表 Users,它可能包括用戶(hù)唯一標(biāo)記:UserID,用戶(hù)名:UserName,密碼:Password,用戶(hù)的郵件地址:Email,用戶(hù)所在城市:City,用戶(hù)登錄次數(shù) LoginCount 等。可以通過(guò)創(chuàng)建一個(gè) UserInRoles 數(shù)據(jù)表(一般可以包括兩個(gè)字段,用戶(hù)名:UserName,用戶(hù)角色:UserRoles)來(lái)實(shí)現(xiàn)為用戶(hù)分配角色。

為了簡(jiǎn)單,我只創(chuàng)建一個(gè) Users 數(shù)據(jù)表,它有3個(gè)字段,用戶(hù)名 UserName,密碼 Password,用戶(hù)角色 UserRoles。創(chuàng)建表之前,你要選擇數(shù)據(jù)庫(kù),或者創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)。要?jiǎng)?chuàng)建一個(gè)新的命名為WebSolution的數(shù)據(jù)庫(kù) ,只需要簡(jiǎn)單的SQL語(yǔ)句:

  1. Create DATABASE WebSolution  
  2. GO   
  3. 要選擇一個(gè)叫msdb的數(shù)據(jù)庫(kù),可以使用SQL語(yǔ)句:   
  4. USE msdb  
  5. GO   
  6. 接下來(lái),我們創(chuàng)建剛才提到的 Users 數(shù)據(jù)表,  
  7. SQL 腳本如下:  
  8. Create TABLE Users  
  9. (  
  10. UserName nvarchar(100) CONSTRAINT   
  11. PK_UserName PRIMARY KEY,  
  12. Password nvarchar(150),  
  13. UserRoles nvarchar(100)  
  14. )   
  15. 可以為這個(gè)表創(chuàng)建索引 Credentials,SQL語(yǔ)句如下:  
  16. Create INDEX Credentials ON Users  
  17. (  
  18. UserName,  
  19. Password 
  20. )   

是否創(chuàng)建索引是可選的,由你自己決定。索引的好處和壞處請(qǐng)參考相關(guān)資料。

然后我們?yōu)檫@個(gè)Users數(shù)據(jù)庫(kù)添加數(shù)據(jù)。角色名稱(chēng)由你自己自由選擇,但是最好用有意義的名稱(chēng),

比如"Administrator"(頂級(jí)管理員),"Manager"(管理員),"Member"(加盟成員),"User"(普通用戶(hù))等。

例如:

  1. UserName|Password|Roles  
  2. "willmove"|"pwd123"|"Administrator,User" 
  3. "amuhouse"|"pwd123"|"User"   
  4. 其SQL語(yǔ)句是:   
  5. --注意 '45CB41B32DCFB917CCD8614F1536D6DA'   
  6. 是 'pwd123' 使用 md5 加密后的字符串   
  7. Insert INTO Users(UserName,Password,UserRoles)   
  8. VALUES ('willmove','45CB41B32DCFB917CCD8614F1536D6DA' 
  9. ,'Administrator,User')  
  10. GO  
  11. Insert INTO Users(UserName,Password,UserRoles)   
  12. VALUES ('amuhouse','45CB41B32DCFB917CCD8614F1536D6DA' 
  13. ,'User')  
  14. GO   

要注意的是角色 Roles 是大小寫(xiě)敏感的,這是因?yàn)樵?Web.config 文件中是大小寫(xiě)敏感的。現(xiàn)在我們?yōu)閷?shí)現(xiàn)這個(gè)安全認(rèn)證機(jī)制創(chuàng)建幾個(gè)必要的頁(yè)面。

首先是用戶(hù)登錄頁(yè)面 Login.aspx

如果還沒(méi)有創(chuàng)建Web應(yīng)用程序,那就現(xiàn)在創(chuàng)建一個(gè)。當(dāng)然你也可以在一個(gè)已有的Web應(yīng)用程序中創(chuàng)建這個(gè)頁(yè)面。這里我假設(shè)已經(jīng)創(chuàng)建了一個(gè)名稱(chēng)為 RolebasedAuth的Web應(yīng)用程序(即 Visual Studio .Net 中的Project)。我把這個(gè)Login.aspx放在它的根目錄下,也就是通過(guò) http://localhost/RolebasedAuth/Login.aspx 可以訪(fǎng)問(wèn)。這個(gè)Login.aspx放在哪里是無(wú)所謂的,但是在ASP.NET安全認(rèn)證機(jī)制中它必須是公眾有權(quán)限訪(fǎng)問(wèn)的。

  #p# 

在應(yīng)用程序根路徑下,我們創(chuàng)建兩個(gè)機(jī)密的子目錄,分別是 Admin 和 User。

接下來(lái),我們創(chuàng)建一個(gè)支持角色認(rèn)證的窗體的基于ASP.NET安全認(rèn)證機(jī)制的登錄系統(tǒng)。因?yàn)槲④洓](méi)有提供簡(jiǎn)單的實(shí)現(xiàn)機(jī)制,我們要自己花些時(shí)間去創(chuàng)建認(rèn)證票據(jù)。它需要存貯少量信息,當(dāng)然,有些名稱(chēng)必須和 Web.config 中配置的一樣,要不ASP.NET 就會(huì)認(rèn)為你的認(rèn)證票據(jù)是無(wú)效的,從而強(qiáng)制轉(zhuǎn)向到登錄頁(yè)面。我們?cè)?VS.NET 中為 Login.aspx 添加兩個(gè)TextBox控件,取名 UserNameTextBox, PasswordTextBox,再添加一個(gè)Button,取名 LoginButton,點(diǎn)擊它進(jìn)入后臺(tái)代碼。

在 LoginButton_Click 方法中添加需要的代碼。如下:

  1. private void LoginButton_Click  
  2. (object sender, System.EventArgs e)  
  3.  
  4. {  
  5. // 初始化   
  6. FormsAuthentication  
  7. // 注意它是在   
  8. System.Web.Security 命名空間  
  9. // 因此要在代碼開(kāi)始添加   
  10. using System.Web.Security;  
  11. FormsAuthentication.Initialize ();   
  12.  
  13. // 創(chuàng)建數(shù)據(jù)庫(kù)連接和數(shù)據(jù)庫(kù)操作命令對(duì)象  
  14. // 注意它是在   
  15. System.Data.SqlClient 命名空間  
  16. // 因此要在代碼開(kāi)始處添加   
  17. using System.Data.SqlClient;  
  18. SqlConnection conn =  
  19. new SqlConnection("Data   
  20. Source=sun-willmove;integrated   
  21. security=SSPI;  
  22. Initial Catalog=WebSolution;");   
  23. SqlCommand cmd = conn.CreateCommand();  
  24. cmd.CommandText = "Select UserRoles   
  25. FROM Users Where UserName=@username " +  
  26. "AND Password=@password";  
  27. // 填充各個(gè)參數(shù)   
  28. cmd.Parameters.Add("@username",   
  29. SqlDbType.NVarChar, 100).Value =  
  30. UserNameTextBox.Text;  
  31. cmd.Parameters.Add("@password",   
  32. SqlDbType.NVarChar, 150).Value =   
  33. FormsAuthentication.  
  34. HashPasswordForStoringInConfigFile(  
  35. PasswordTextBox.Text, "md5");  
  36.  // 或者 "sha1" 
  37.  
  38. // 執(zhí)行數(shù)據(jù)庫(kù)操作命令  
  39. conn.Open();  
  40. SqlDataReader reader = cmd.ExecuteReader();  
  41. if (reader.Read())  
  42. {  
  43. // 為了實(shí)現(xiàn)認(rèn)證,創(chuàng)建一個(gè)新的票據(jù)  
  44. FormsAuthenticationTicket ticket = new   
  45. FormsAuthenticationTicket(   
  46. 1, // 票據(jù)版本號(hào)  
  47. UserNameTextBox.Text, // 票據(jù)持有者  
  48. DateTime.Now, //分配票據(jù)的時(shí)間  
  49. DateTime.Now.AddMinutes(30), // 失效時(shí)間  
  50. true, // 需要用戶(hù)的 cookie   
  51. reader.GetString(0), // 用戶(hù)數(shù)據(jù),  
  52. 這里其實(shí)就是用戶(hù)的角色  
  53. FormsAuthentication.FormsCookiePath);  
  54. //cookie有效路徑   
  55.  
  56. //使用機(jī)器碼machine key加密cookie,  
  57. 為了安全傳送  
  58. string hash = FormsAuthentication.  
  59. Encrypt(ticket);  
  60. HttpCookie cookie = new HttpCookie(  
  61. FormsAuthentication.FormsCookieName,   
  62. // 認(rèn)證cookie的名稱(chēng)  
  63. hash); //加密之后的cookie   
  64.  
  65. //將cookie的失效時(shí)間設(shè)置為和  
  66. 票據(jù)tikets的失效時(shí)間一致   
  67. if (ticket.IsPersistent) cookie.  
  68. Expires = ticket.Expiration;   
  69.  
  70. //添加cookie到頁(yè)面請(qǐng)求響應(yīng)中  
  71. Response.Cookies.Add(cookie);   
  72.  
  73. // 將用戶(hù)轉(zhuǎn)向到之前請(qǐng)求的頁(yè)面,  
  74. // 如果之前沒(méi)有請(qǐng)求任何頁(yè)面,就轉(zhuǎn)向到首頁(yè)   
  75. string returnUrl = Request.QueryString  
  76. ["ReturnUrl"];  
  77. if (returnUrl == null) returnUrl = "./";   
  78.  
  79. // 不要調(diào)用 FormsAuthentication.  
  80. RedirectFromLoginPage 方法,  
  81. // 因?yàn)樗鼤?huì)把剛才添加的票據(jù)(cookie)替換掉  
  82. Response.Redirect(returnUrl);  
  83. }  
  84. else 
  85. {  
  86. // 不要告訴用戶(hù)"密碼錯(cuò)誤",  
  87. 這樣等于給了入侵者一個(gè)機(jī)會(huì),  
  88. // 因?yàn)樗麄冎懒怂麄冚斎氲挠脩?hù)名是存在的   
  89. //   
  90. ErrorLabel.Text = "用戶(hù)名或者密碼錯(cuò)誤,請(qǐng)重試!";  
  91. ErrorLabel.Visible = true;  
  92. }   
  93. reader.Close();  
  94. conn.Close();  
  95. }   
  96.  
  97. 前臺(tái) aspx 頁(yè)面代碼如下:   
  98. 〈 %@ Page language="c#" Codebehind="Login.aspx.cs"   
  99. AutoEventWireup="false"   
  100. Inherits="RolebasedAuth.Login" %〉  
  101. 〈 !DOCTYPE HTML PUBLIC "-//W3C  
  102. //DTD HTML 4.0 Transitional//EN" 〉  
  103. 〈 HTML〉  
  104. 〈 HEAD〉  
  105. 〈 title〉Login〈 /title〉  
  106. 〈 meta name="GENERATOR" Content="Microsoft   
  107. Visual Studio .NET 7.1"〉  
  108. 〈 meta name="CODE_LANGUAGE" Content="C#"〉   
  109. 〈 meta name="vs_defaultClientScript"   
  110. content="JavaScript"〉  
  111. 〈 meta name="vs_targetSchema"   
  112. content="http://schemas.microsoft.com/  
  113. intellisense/ie5 "〉  
  114. 〈 /HEAD〉  
  115. 〈 body〉  
  116. 〈 form id="Form1" method="post" runat="server"〉  
  117. 〈 P〉  
  118. 〈 asp:Label id="Label1" runat="server"〉  
  119. 用戶(hù)名:〈 /asp:Label〉   
  120. 〈 asp:TextBox id="UserNameTextBox" runat="server"〉  
  121. 〈 /asp:TextBox〉〈 /P〉  
  122. 〈 P〉〈 FONT face="宋體"〉 〈 /FONT〉  
  123. 〈 asp:Label id="Label2" runat="server"〉  
  124. 密碼:〈 /asp:Label〉   
  125. 〈 asp:TextBox id="PasswordTextBox" runat="server"   
  126. TextMode="Password"〉〈 /asp:TextBox〉〈 /P〉   
  127. 〈 P〉  
  128. 〈 asp:Label id="ErrorLabel" runat="server"   
  129. Visible="False"〉  
  130. 〈 /asp:Label〉〈 /P〉   
  131. 〈 P〉  
  132. 〈 asp:Button id="LoginButton" runat="server"   
  133. Text="登錄"〉  
  134. 〈 /asp:Button〉〈 /P〉  
  135. 〈 /form〉  
  136. 〈 /body〉  
  137. 〈 /HTML〉   

 #p#

你會(huì)注意到上面我們對(duì)密碼的處理:將它哈希加密。哈希加密是一種單向算法(不可逆算法),生成唯一的字符數(shù)組。因此即使是改變密碼中一個(gè)字母的大小寫(xiě),都會(huì)生成完全不同的哈希列。我們把這些加密的密碼存儲(chǔ)在數(shù)據(jù)庫(kù)中,這樣更安全。在實(shí)際應(yīng)用中,你可能想為用戶(hù)找回忘記的密碼。但是哈希散列是不可逆的,所以你就不可能恢復(fù)原來(lái)的密碼。但是你可以更改用戶(hù)的密碼,并且把這個(gè)更改后的密碼告訴他。如果一個(gè)網(wǎng)站能夠給你舊密碼,那么你要考慮清楚了,你的用戶(hù)數(shù)據(jù)是不安全的!事實(shí)上,國(guó)內(nèi)大部分網(wǎng)站都是沒(méi)有經(jīng)過(guò)加密直接把用戶(hù)的密碼存儲(chǔ)到數(shù)據(jù)庫(kù)中的。如何一個(gè)黑客入侵成功,那么這些用戶(hù)帳戶(hù)就很危險(xiǎn)了!

如果沒(méi)有使用SSL,你的密碼在網(wǎng)絡(luò)中也是以明文傳輸?shù)摹鬏斶^(guò)程中可能會(huì)被竊取。在服務(wù)器端加密密碼只能保證密碼存儲(chǔ)的安全。SSL相關(guān)的資料可以在 http://www.versign.com或 http://www.thewte.com 中找到。

如果你不想以加密方式在數(shù)據(jù)庫(kù)中存儲(chǔ)密碼,你可以更改上面的代碼,把

  1. FormsAuthentication.HashPasswordForStoringInConfigFile  
  2. (PasswordTextBox.Text, "md5") 改成  
  3.  PasswordTextBox.Text 即可。  

下一步,我們需要修改 Global.asax 文件。如果你的Web應(yīng)用程序沒(méi)有這個(gè)文件,請(qǐng)右鍵單擊Web應(yīng)用項(xiàng)目,選擇 "添加->添加新項(xiàng)...->Global Application Class"。在 Global.asax 或者 Global.asax.cs 中,找到叫做 Application_AuthenticationRequest 的方法(函數(shù))。先要確認(rèn)已經(jīng)包含或者使用了 System.Security.Principal 以及 System.Web.Security 命名空間,然后修改它,修改后的代碼:

  1. protected void Application_AuthenticateRequest  
  2. (Object sender, EventArgs e)   
  3. {  
  4. if (HttpContext.Current.User != null)  
  5. {  
  6. if (HttpContext.Current.User.Identity.  
  7. IsAuthenticated)  
  8. {  
  9. if (HttpContext.Current.User.Identity   
  10. is FormsIdentity)  
  11. {  
  12. FormsIdentity id =  
  13. (FormsIdentity)HttpContext.Current.User.Identity;  
  14. FormsAuthenticationTicket ticket = id.Ticket;   
  15.  
  16. // 取存儲(chǔ)在票據(jù)中的用戶(hù)數(shù)據(jù),  
  17. 在這里其實(shí)就是用戶(hù)的角色  
  18. string userData = ticket.UserData;  
  19. string[] roles = userData.Split(',');  
  20. HttpContext.Current.User = new   
  21. GenericPrincipal(id, roles);  
  22. }  
  23. }  
  24. }   
  25. }  

認(rèn)證票據(jù)(用戶(hù)名和密碼)是沒(méi)有作為cookie的一部分來(lái)存儲(chǔ)的,而且也不可以,因?yàn)橛脩?hù)可以修改他們的cookie。

事實(shí)上,F(xiàn)ormsAuthentication是用你的機(jī)器碼 (machine key,通常在 machine.config 中)來(lái)加密票據(jù)(FormsAuthenticationTicket)的。我們使用 UserData 存儲(chǔ)用戶(hù)角色,并且生成一個(gè)新的憑證。一旦憑證已經(jīng)創(chuàng)建,它會(huì)被添加到當(dāng)前上下文中(即 HttpContext),這樣就可以用它來(lái)取回用戶(hù)角色了。

接下來(lái),我們?cè)O(shè)置機(jī)密目錄(也就是"安全目錄",特定的使用者如管理員才有權(quán)限訪(fǎng)問(wèn)的目錄)。首先看看你的Web應(yīng)用程序根目錄下是否有 Web.config 這個(gè)文件,如果沒(méi)有就創(chuàng)建一個(gè)。你也可以在你的子目錄中創(chuàng)建 Web.config 文件,當(dāng)然,這個(gè) Web.config 文件是有限制的(一些參數(shù)它不可以設(shè)置)。要實(shí)現(xiàn)安全認(rèn)證,在 Web應(yīng)用程序根目錄下的 Web.config 文件中找到 〈system.web〉 節(jié)點(diǎn)下的

  1. 〈authentication mode="Windows" /〉,  
  2. 把它修改為   
  3. 〈authentication mode="Forms" 〉  
  4. 〈forms name="AMUHOUSE.ASPXAUTH" 
  5. loginUrl="Login.aspx" 
  6. protection="All" 
  7. path="./" /〉  
  8. 〈/authentication〉  
  9. authorization〉  
  10. 〈allow users="*"/〉  
  11. 〈/authorization 〉  

上面的 name="AMUHOUSE.ASPXAUTH" 中,AMUHOUSE.ASPXAUTH 這個(gè)名稱(chēng)是任意的。要控制用戶(hù)或者用戶(hù)組的權(quán)限,我們可以有兩種方法,一是配置在應(yīng)用程序根目錄下的 Web.config 文件,二是在機(jī)密目錄下創(chuàng)建一個(gè)獨(dú)立的 Web.config 文件。(后者也許會(huì)比較好。)如果是前者,這個(gè)Web.config 就應(yīng)該包含有下面的內(nèi)容(或者類(lèi)似的內(nèi)容):

  1. 〈configuration 〉  
  2. 〈system.web 〉  
  3. 〈authentication mode="Forms" 〉  
  4. 〈forms name=" AMUHOUSE.ASPXAUTH" 
  5. loginUrl="login.aspx" 
  6. protection="All" 
  7. path="/"/ 〉  
  8. 〈/authentication 〉  
  9. authorization 〉   
  10. 〈allow users="*"/ 〉  
  11. 〈/authorization 〉  
  12. 〈/system.web 〉  
  13. 〈location path="./Admin" 〉  
  14. 〈system.web 〉  
  15. authorization 〉   
  16. 〈!-- 注意!下面幾行的順序和大小寫(xiě)是非常重要的! -- 〉  
  17. 〈allow roles="Administrator"/ 〉  
  18. 〈deny users="*"/ 〉  
  19. 〈/authorization 〉  
  20. 〈/system.web 〉   
  21. 〈/location 〉  
  22. 〈location path="./User" 〉  
  23. 〈system.web 〉  
  24. authorization 〉  
  25. 〈!-- 注意!下面幾行的順序和大小寫(xiě)是非常重要的! -- 〉  
  26. 〈allow roles="User"/ 〉   
  27. 〈deny users="*"/ 〉  
  28. 〈/authorization 〉  
  29. 〈/system.web 〉  
  30. 〈/location 〉  
  31. 〈/configuration 〉  

為了使Web應(yīng)用程序的目錄之前不互相依賴(lài),可以比較方便的改名或者移動(dòng),可以選擇在每一個(gè)安全子目錄下配置單獨(dú)的 Web.config 文件。它只需要配置 〈authorization/〉節(jié)點(diǎn),如下:

  1. 〈 configuration 〉  
  2. 〈 system.web 〉  
  3. 〈 authorization 〉  
  4. 〈 !-- 注意!下面幾行的順序和大小寫(xiě)是非常重要的! -- 〉  
  5. 〈 allow roles="Administrator"/ 〉   
  6. 〈 deny users="*"/ 〉  
  7. 〈 /authorization 〉  
  8. 〈 /system.web 〉  
  9. 〈 /configuration 〉 

需要再次提醒的是,上面的角色 roles 是大小寫(xiě)敏感的,為了方便,你也可以把上面修改為:

  1. 〈 allow roles="Administrator,administrator" /〉 

如果你想允許或者禁止多個(gè)角色對(duì)這個(gè)目錄的訪(fǎng)問(wèn),可以用逗號(hào)隔開(kāi),如:

  1. 〈 allow roles="Administrator,Member,User" /〉  
  2. 〈 deny users="*" /〉  

至此,我們已經(jīng)為網(wǎng)站配置了基于角色的ASP.NET安全認(rèn)證機(jī)制了。

你可以先編譯你的程序,然后嘗試訪(fǎng)問(wèn)一個(gè)機(jī)密目錄,例如 http://localhost/RolebasedAuth/Admin,這時(shí)候你就會(huì)被轉(zhuǎn)向到用戶(hù)登錄頁(yè)面。如果你登錄成功,并且你的角色對(duì)這個(gè)目錄有訪(fǎng)問(wèn)權(quán)限,你就重新回到這個(gè)目錄下。可能會(huì)有用戶(hù)(或入侵者)企圖進(jìn)入機(jī)密目錄,我們可以使用一個(gè) Session 來(lái)存儲(chǔ)用戶(hù)登錄的次數(shù),超過(guò)一定次數(shù)就不讓用戶(hù)登錄,并且顯示"系統(tǒng)拒絕了你的登錄請(qǐng)求!"。

下面,我們討論如何根據(jù)用戶(hù)角色讓W(xué)eb控件顯示不同內(nèi)容。

有時(shí)候根據(jù)用戶(hù)的角色來(lái)顯示內(nèi)容比較好,因?yàn)槟憧赡懿幌霝槟敲炊嗖煌慕巧ㄓ脩?hù)群組)制作一大堆有許多重復(fù)內(nèi)容的頁(yè)面。這樣的網(wǎng)站,各種用戶(hù)帳戶(hù)可以并存,付費(fèi)的用戶(hù)帳戶(hù)能夠訪(fǎng)問(wèn)附加的付費(fèi)內(nèi)容。另一個(gè)例子是一個(gè)頁(yè)面將顯示一個(gè) "進(jìn)入后臺(tái)管理" 按鈕鏈接到后臺(tái)管理頁(yè)面如果當(dāng)前用戶(hù)是 "Administrator"(高級(jí)管理員)角色。我們現(xiàn)在就實(shí)現(xiàn)這個(gè)頁(yè)面。

 #p#

我們上面用到的 GenericPrincipal 類(lèi)實(shí)現(xiàn)了 IPincipal 接口,這個(gè)接口有一個(gè)方法名叫做 IsInRole(),它的參數(shù)是一個(gè)字符串,這個(gè)字符串就是要驗(yàn)證的用戶(hù)角色。如果我們要顯示內(nèi)容給角色是 "Administrator"的已登錄用戶(hù),我們可以在 Page_Load 中添加下面代碼: 程序代碼

  1. if (User.IsInRole("Administrator"))  
  2. AdminLink.Visible = true;   
  3. 整個(gè)的頁(yè)面代碼如下  
  4. (為了簡(jiǎn)便,把后臺(tái)代碼也寫(xiě)在aspx頁(yè)面): 程序代碼   
  5. 〈html 〉  
  6. 〈head 〉  
  7. 〈title 〉歡迎您!〈/title 〉  
  8. 〈script runat="server" 〉   
  9. protected void Page_Load(Object sender,   
  10. EventArgs e)  
  11. {  
  12. if (User.IsInRole("Administrator"))  
  13. AdminLink.Visible = true;  
  14. else 
  15. AdminLink.Visible = false;  
  16. }  
  17. 〈/script 〉   
  18. 〈/head 〉  
  19. 〈body 〉  
  20. 〈h2 〉歡迎!〈/h2 〉  
  21. 〈p 〉歡迎來(lái)到阿木小屋   
  22. http://amuhouse.com/ ^_^〈/p 〉  
  23. 〈asp:HyperLink id="AdminLink" runat="server"   
  24. Text="管理首頁(yè)" NavigateUrl="./Admin"/ 〉  
  25. 〈/body 〉  
  26. 〈/html 〉   

樣,鏈接到 Admin 目錄的HyperLink 控件只會(huì)顯示給角色是 Administrator 的用戶(hù)。你也可以根據(jù)為未登錄用戶(hù)提供一個(gè)鏈接到登錄頁(yè)面,如:程序代碼

  1. protected void Page_Load  
  2. (object sender, System.EventArgs e)  
  3. {   
  4. if (User.IsInRole("Administrator"))  
  5. {  
  6. AdminLink.Text = "管理員請(qǐng)進(jìn)";  
  7. AdminLink.NavigateUrl="./Admin";   
  8. }  
  9. else if(User.IsInRole("User"))  
  10. {  
  11. AdminLink.Text = "注冊(cè)用戶(hù)請(qǐng)進(jìn)";  
  12. AdminLink.NavigateUrl="./User";   
  13. }   
  14. else   
  15. {  
  16. AdminLink.Text = "請(qǐng)登錄";  
  17. AdminLink.NavigateUrl="Login.aspx?  
  18. ReturnUrl=" + Request.Path;  
  19. }   
  20. }   

這里,我們通過(guò)設(shè)置叫做ReturnUrl的 QueryString 變量,可以使用戶(hù)登錄成功后返回到當(dāng)前的這個(gè)頁(yè)面.

小結(jié):

本文用于幫助你理解基于角色安全機(jī)制的重要性、實(shí)用性,并且也通過(guò)ASP.NET安全認(rèn)證機(jī)制實(shí)現(xiàn)了基于角色的安全控制。它并不是一個(gè)很難實(shí)現(xiàn)的機(jī)制,不過(guò)它可能需要一些相關(guān)知識(shí)如 什么是用戶(hù)憑證,如何認(rèn)證用戶(hù)身份,以及如何審定授權(quán)用戶(hù)。如果你覺(jué)得它很有幫助,我會(huì)非常高興。我希望它可以引導(dǎo)你在你的網(wǎng)站中去實(shí)現(xiàn)基于角色的窗體安全認(rèn)證機(jī)制。

【編輯推薦】

  1. ASP.NET環(huán)境下的Shell函數(shù)
  2. 在ASP.NET中向數(shù)據(jù)庫(kù)批量插入數(shù)據(jù)
  3. ASP.NET用Post方式向網(wǎng)頁(yè)發(fā)送數(shù)據(jù)
  4. ASP.NET 2.0部署WEB應(yīng)用程序淺析
  5. ASP.NET中的HttpWorkerRequest對(duì)像
  6. 介紹ASP.NET MVC框架
責(zé)任編輯:冰荷 來(lái)源: it55
相關(guān)推薦

2009-07-29 10:56:54

ASP.NET構(gòu)架與安

2009-07-23 16:59:31

ASP.NET認(rèn)證Form表單

2009-07-29 13:04:59

2009-12-21 10:05:10

ASP.NET MVC

2009-07-27 13:39:06

Web窗體頁(yè)ASP.NET

2009-08-04 15:22:33

ASP.NET緩存機(jī)制

2012-04-16 09:54:26

2009-08-03 18:35:51

ASP.NET數(shù)據(jù)緩存

2009-08-17 16:59:36

ASP.NET緩存機(jī)制

2012-05-07 14:50:32

ASP.NET

2009-06-19 16:20:14

ASP.NET錯(cuò)誤處理

2009-04-08 09:58:07

ASP.NET MVCTempData框架

2009-07-20 15:44:32

ASP.NET MVC

2009-06-12 09:24:34

ASP.NET窗體ASP.NET MVC

2009-07-22 17:45:11

ASP.NET插件

2009-07-23 17:05:11

ASP.NET安全性

2009-07-20 15:57:42

ASP.NET安全架構(gòu)

2009-12-07 09:23:05

ASP.NET MVC

2009-08-03 14:22:33

什么是ASP.NET

2009-07-28 17:17:19

ASP.NET概述
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲视频一区二区三区 | 成人精品一区亚洲午夜久久久 | 亚洲一区二区免费 | av中文在线 | 国产精品成人一区二区三区 | 中文字幕亚洲视频 | 久久久久久久久久久久久9999 | 国产日韩一区二区 | 日日网| 在线观看中文字幕一区二区 | 中国三级黄色录像 | 一区福利视频 | 99久久免费精品视频 | 日本手机看片 | 黄色一级免费 | 亚洲欧美在线一区 | 精品国产91乱码一区二区三区 | www.日日操 | 视频一二三区 | 欧美日韩中文字幕在线 | 国产影音先锋 | 国产精品日韩欧美一区二区三区 | 精品无码三级在线观看视频 | 亚洲 成人 在线 | 中文字幕亚洲视频 | 在线免费观看一区二区 | 四虎影院欧美 | 毛片久久久 | 亚洲精品视 | 精品久久久久久一区二区 | 中文字幕视频一区 | 91久久视频 | 精品国产免费人成在线观看 | 精品欧美一区二区久久久伦 | 日本久久网站 | 久久狠狠 | 成人视屏在线观看 | 久久精品av | 国产精品爱久久久久久久 | 翔田千里一区二区 | 成人在线精品视频 |