asp.NetForms認証とロールベースの権限アクセス

7410 ワード

主な思想:Forms認証は合法的なユーザーかどうかを判断するために使用され、ユーザーが合法的になった後、ユーザーの役割を通じてアクセスできるページを決定する.
具体的な手順:
1、ウェブサイトを作成して、構造は以下の通りです.
Webサイトのルート
Adminディレクトリ---->管理者ディレクトリ
                Manager.aspx------>管理者がアクセスできるページ
Usersディレクトリ---->ユーザーディレクトリの登録
                Welcome.aspx------>登録ユーザーがアクセスできるページ
Errorディレクトリ---->エラーメッセージディレクトリ
                AccessError.htm------>エラーメッセージページへのアクセス
            default.aspx------>Webサイトのデフォルトページ
            login.aspx------>サイト登録ページ
            web.config------>Webサイトのプロファイル
2、webを配置する.configは以下の通りです.


        
            
                
                
                    
                

                
                    
                

            

        


        
        
            
                
                    
                    
                

            

        

        
        
            
                
                    
                    
                

            

        

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を追加する.一般的な認証コードは次のとおりです.


        // 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ページ.
注意:テスト時に安全終了ボタンをクリックすることに注意してください.そうしないと、テスト結果に影響します.