TheBeerHouse 網站項目學習筆記(3)----安全管理(上)

                    

1. 源碼下載:  http://www.asp.net/Downloads/starter-kits/the-beer-house

2. 功能技術點介紹: http://www.codeplex.com/TheBeerHouse

3. 該項目真實網站: http://www.ericengler.com/  

                    前述文章:      TheBeerHouse 網站項目學習筆記(1)----換膚技術  
                                       TheBeerHouse 網站項目學習筆記(2)----個性化管理 
                    必備知識文章:ASP.NET 2.0下實現匿名用戶向註冊用戶的遷移(上) 
                                       ASP.NET 2.0下實現匿名用戶向註冊用戶的遷移(下)

                    摘要: 安全管理是網站設計不可迴避的問題,也是網站設計的重用組成部分.這些組成部分都需要對不同的用戶進行識別,檢查用戶是否有權限對那些受限制的網頁進行訪問,這種方法稱爲認證(authentication).決定用戶可以對哪些內容進行訪問,這種方法稱爲授權(authorization).這兩個概念容易弄混淆,那麼可以這麼來理解: 認證---你是誰?   授權---我已經知道你是誰,你可以做什麼? 認證和授權是網站成員權限管理的一部分,包括創建新用戶,用戶證書管理(包括密碼保護機制,例如爲遺忘密碼的用戶進行密碼恢復)以及與賬戶關聯的角色管理.通過MS爲我們提供的內置權限管理,我們可以快速建立整套網站的權限管理系統.上篇主要討論"你是誰",下篇主要討論"我已經知道你是誰,你可以做什麼"

     那麼我們接下來兩篇就是着重討論TheBeerHouse網站利用MS提供的內部權限管理機制(見開頭必備文章鏈接)進行的認證和授權管理.

     首先來看認證管理,即解決"你是誰"的問題.

      一.用戶創建
              首先通過界面右上登錄密碼下的 " Create new account "進入用戶賬戶創建頁面,如下圖:
               
     通過上述界面我們可以創建一個用戶johnson,密碼也是johnson.需要注意的是: 1. 這裏註冊界面不是多個用單個控件(label和textbox)組成,而是使用了ASP.NET 2.0提供的成員權限管理的控件CreateUserWizard      2. 此界面上註冊信息比較單調,還有很多諸如國家,職業等信息在此界面創建用戶成功後彈出的下一個個性化信息界面得到設置,如下圖:
          
設置好上述可選的信息後,單擊最下方的"完成"按鈕後,該用戶就創建好了.創建好該用戶後,系統自動用該帳號登錄到首頁,並顯示歡迎信息:
                                                                 
下面利用必備文章中介紹的知識進入用戶管理界面( 停掉剛纔運行的網站,在選中解決方案下的網站後,單擊菜單"網站"-->"ASP.NET配置"),如下圖:
                 -----> 

打開ASP.NET網站管理工具--->  安全  ---> 管理用戶 ---> 在johnson用戶後單擊 "編輯用戶" ,可以看到該用戶的基本信息和角色如下:
                         

我們可以看到,系統默認建立的用戶角色是posters,上述這麼五個角色都是在此界面通過ASP.NET網站管理工具建立得到的,利用如下查詢命令可以在自定義數據庫中得到所有用戶的用戶名,密碼,以及角色,具體見必備知識文章:

               


利用上面四個表聯合查詢可以得到所有用戶信息,我們剛建立的johnson用戶也在裏面,見紅色虛線框.十個用戶產生了二十條記錄,那是因爲同一個用戶可以具有多個角色的緣故.
我們可以看到,密碼全部經過加密處理,這裏的加密方法是對稱加密(symmetric encryption)法,該方法使用系統保護密碼對所有用戶密碼加密.這是一種雙向加密,可以對密碼加密,也可以對其解密.對於用戶而言,能夠將忘記的密碼通過電子郵件發送.

上述解決了認證的第一個問題:創建用戶,那麼接下來討論認證的第二個問題---認證過程.

二. 帳號認賬過程
     首先看看配置文件web.config中配置節的代碼

     <authentication mode="Forms">
        <forms cookieless="AutoDetect" loginUrl="~/AccessDenied.aspx" name="TBHFORMAUTH"/>
     </authentication>

Forms表示本網站採取表單認證方式,而不是Windows方式,如果用後者認證,那麼也就是登錄了Windows的用戶就可以登錄網站了,顯然在這裏是不可取的.那麼表單認證方式需要用戶提交各種票據,比如用戶名和密碼等信息,系統判定正確後方可登錄.

AccessDenied.aspx頁面從名稱就可以知道這是當用戶訪問一個受保護的頁面時所要跳轉到的頁面,通俗講就是當用戶名/密碼輸入不正確或訪問某個頁面的權限不夠時自動跳轉的頁面.
下面介紹該頁面的效果圖和前後臺代碼以及註釋:


情況1:登錄用戶名或密碼不對   

====================================================================================================

情況2:登錄用戶權限不足

 

===========================================================================

情況3:由登錄用戶做了註銷處理後,  用戶切換後,用戶名密碼對,但訪問當前頁面的權限不足



AccessDenied.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AccessDenied.aspx.cs" Inherits="MB.TheBeerHouse.UI.AccessDenied"
    Title
="The Beer House - Access Denied" MasterPageFile="~/Template.master" %>

<asp:Content ID="MainContent" ContentPlaceHolderID="MainContent" runat="Server">
    
&nbsp;<asp:Label runat="server" ID="lblLoginRequired" Font-Bold="true">
    要訪問此頁,您必須是註冊用戶.如果您已經有了賬戶,
    請在右上角通過用戶憑證登錄,否則
<a href="Register.aspx">點擊這裏</a> 免費註冊
    
</asp:Label>
    
<asp:Label runat="server" ID="lblInsufficientPermissions" Font-Bold="true">
    抱歉,由於沒有足夠的權限,您請求的頁面無法訪問
    
</asp:Label>&nbsp;
    
<asp:Label runat="server" ID="lblInvalidCredentials" Font-Bold="true">
    您輸入的憑證無效.請檢查後重新輸入,如果您忘記了密碼,
 
<a href="PasswordRecovery.aspx">單擊這裏</a> 試着恢復密碼
    
</asp:Label>
    
<asp:Image ID="imgLock" runat="server" ImageUrl="~/images/lock.gif" ImageAlign="left"
        AlternateText
="Access denied" />
</asp:Content>

 

 

AccessDenied.aspx.cs
 1using System;
 2using System.Data;
 3using System.Configuration;
 4using System.Collections;
 5using System.Web;
 6using System.Web.Security;
 7using System.Web.UI;
 8using System.Web.UI.WebControls;
 9using System.Web.UI.WebControls.WebParts;
10using System.Web.UI.HtmlControls;
11
12namespace MB.TheBeerHouse.UI
13{
14    public partial class AccessDenied : BasePage
15    {
16
17        /**//*登錄時,凡是下列情況都會自動進入此頁面來,這是由web.config中
18                 loginUrl="~/AccessDenied.aspx"  配置節決定的
19         *   1.  登錄用戶名或密碼不對
20         *   2.  由登錄用戶做了註銷處理後,馬上到此頁面來
21         *   3.  由登錄用戶做了註銷處理後,  用戶切換後,用戶名密碼對,但訪問當前頁面的權限不足,
22         *        這由當前頁的配置權限所約束的  
23         *   4.  
24         *   真正登錄用戶的用戶名密碼正確,權限也具備後,是不會到此頁面來的
25         * */

26        protected void Page_Load(object sender, EventArgs e)
27        {
28            lblInsufficientPermissions.Visible = this.User.Identity.IsAuthenticated;
29            lblLoginRequired.Visible = (!this.User.Identity.IsAuthenticated &&
30               string.IsNullOrEmpty(this.Request.QueryString["loginfailure"]));
31            lblInvalidCredentials.Visible = (this.Request.QueryString["loginfailure"!= null &&
32               this.Request.QueryString["loginfailure"== "1");
33        }

34    }

35
36}

                                                                                                
請注意:User.Identity.IsAuthenticated 在用戶登錄成功後會自動返回true,這裏是利用了ASP.NET內置的權限管理功能實現的.
那麼,上面基本討論了權限管理的第一個問題---"你是誰?"的問題.下面接着來討論第二個問題---"我知道你是誰,你可以幹什麼?"的問題.

       


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章