Forms身份驗證以及基於角色的權限控制

主要思想:Forms身份驗證用來判斷是否合法用戶,當用戶合法後,再通過用戶的角色決定能訪問的頁面。  
具體步驟:  
    1、創建一個網站,結構如下:  
        網站根目錄  
            Admin目錄         ---->    管理員目錄  
                Manager.aspx        ---->    管理員可以訪問的頁面  
            Users目錄         ---->    註冊用戶目錄  
                Welcome.aspx        ---->    註冊用戶可以訪問的頁面  
            Error目錄         ---->    錯誤提示目錄  
                AccessError.htm     ---->    訪問錯誤的提示頁面  
            default.aspx            ---->    網站默認頁面  
            login.aspx          ---->    網站登錄頁面  
            web.config          ---->    網站配置文件  
    2、配置web.config如下:  
        <configuration>  
            <system.web>  
                <!--設置Forms身份驗證-->  
                <authentication mode="Forms">  
                    <forms loginUrl="Login.aspx" name="MyWebApp.APSXAUTH" path="/" protection="All" timeout="30"/>  
                </authentication>  
                <authorization>  
                    <allow users="*"/>  
                </authorization>  
            </system.web>  
        </configuration>  
 
        <!--設置Admin目錄的訪問權限-->  
        <location path="Admin">  
            <system.web>  
                <authorization>  
                    <allow roles="Admin"/>  
                    <deny users="?"/>  
                </authorization>  
            </system.web>  
        </location>  
        <!--設置Users目錄的訪問權限-->  
        <location path="Users">  
            <system.web>  
                <authorization>  
                    <allow roles="User"/>  
                    <deny users="?"/>  
                </authorization>  
            </system.web>  
        </location>  
    3、在login.aspx頁面的登錄部分代碼如下:  
        protected void btnLogin_Click(object sender, EventArgs e)  
        {     
            //Forms身份驗證初始化  
            FormsAuthentication.Initialize();  
            //驗證用戶輸入並得到登錄用戶,txtName是用戶名稱,txtPassword是登錄密碼  
            UserModel um = ValidUser(txtName.Text.Trim(),txtPassword.Text.Trim());  
            if (um != null)  
            {  
                //創建身份驗證票據  
                FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,  
                                            um.Name,  
                                            DateTime.Now,  
                                            DateTime.Now.AddMinutes(30),  
                                            true,  
                                            um.Roles,//用戶所屬的角色字符串  
                                            FormsAuthentication.FormsCookiePath);  
                //加密身份驗證票據  
                string hash = FormsAuthentication.Encrypt(ticket);  
                //創建要發送到客戶端的cookie  
                HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hash);  
                if (ticket.IsPersistent)  
                {  
                cookie.Expires = ticket.Expiration;  
                }  
                //把準備好的cookie加入到響應流中  
                Response.Cookies.Add(cookie);  
                  
                //轉發到請求的頁面  
                Response.Redirect(FormsAuthentication.GetRedirectUrl(um.Name,false));  
            }  
            else 
            {  
                ClientScriptManager csm = this.Page.ClientScript;  
                csm.RegisterStartupScript(this.GetType(), "error_tip", "alert('用戶名或密碼錯誤!身份驗證失敗!');", true);  
            }   
        }     
        //驗證用戶  
        private UserModel ValidUser(string name, string password)   
        {  
            return new UserService().Validate(name, password);  
        }  
    4、給網站添加處理程序Global.asax,其中通用身份驗證代碼如下:  
        //改造原來的User,給其添加一個用戶所屬的角色數據  
        protected void Application_AuthenticateRequest(object sender, EventArgs e)  
        {  
            if (HttpContext.Current.User != 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,加入用戶擁有的角色數組  
                        HttpContext.Current.User = new GenericPrincipal(id, roles);  
                    }  
                }  
            }  
        }  
    5、在Admin目錄中Manager.aspx頁面加載代碼如下:  
        protected void Page_Load(object sender, EventArgs e)  
        {  
            //判斷通過身份驗證的用戶是否有權限訪問本頁面  
            FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;  
            //判斷通過身份驗證的用戶是否是Admin角色  
            if (!id.Ticket.UserData.Contains("Admin"))   
            {  
                //跳轉到訪問權限不夠的錯誤提示頁面  
                Response.Redirect("~/Error/AccessError.htm", true);  
            }  
        }  
        //安全退出按鈕的代碼  
        protected void btnExit_Click(object sender, EventArgs e)  
        {  
            //註銷票據  
            FormsAuthentication.SignOut();  
            ClientScriptManager csm = this.Page.ClientScript;  
            csm.RegisterStartupScript(this.GetType(), "exit_tip", "alert('您已經安全退出了!');", true);  
        }  
    6、在Users目錄中Welcome.aspx頁面加載代碼如下:  
        protected void Page_Load(object sender, EventArgs e)  
        {  
            //判斷通過身份驗證的用戶是否有權限訪問本頁面  
            FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;  
            //判斷通過身份驗證的用戶是否是User角色  
            if (!id.Ticket.UserData.Contains("User"))   
            {  
                //跳轉到訪問權限不夠的錯誤提示頁面  
                Response.Redirect("~/Error/AccessError.htm", true);  
            }  
        }  
        //安全退出按鈕的代碼  
        protected void btnExit_Click(object sender, EventArgs e)  
        {  
            //註銷票據  
            FormsAuthentication.SignOut();  
            ClientScriptManager csm = this.Page.ClientScript;  
            csm.RegisterStartupScript(this.GetType(), "exit_tip", "alert('您已經安全退出了!');", true);  
        }  
測試結果:  
    數據:  
        假設有3個用戶,如下:  
        ------------------------------------------  
        用戶名     密碼      角色字符串  
        ------------------------------------------  
        sa      sa      Admin,User  
        admin       admin       Admin  
        user        user        User  
        ------------------------------------------  
    測試:  
        如果使用admin登錄,只能訪問Admin目錄的Manager.aspx頁面;  
        如果使用user登錄,只能訪問Users目錄的Welcome.aspx頁面;  
        使用sa登錄,既能訪問Admin目錄的Manager.aspx頁面,又能訪問Users目錄的Welcome.aspx頁面。  
    注意:測試時注意及時點擊安全退出按鈕,否則影響測試結果。 


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/iambenbenchen/archive/2009/09/24/4590270.aspx

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