Asp.NetMvc認証、異常処理、権限検証(ブロッカー)

12715 ワード

Asp.NetMvc認証、異常処理、権限検証(ブロッカー)


この質問は主にaspを紹介する.Netの認証メカニズムとasp.NetMVCブロッキングのプロジェクトでの運用.次に、ユーザーログイン権限検証の例外処理という簡単なプロセスをシミュレートします.

1、ユーザーログイン


ユーザーがログインに成功したかどうかを検証する手順は直接無視され、ユーザーがログインに成功した後、現在のユーザーログイン情報(session,cookie)をどのように保存するかを説明します.本稿では、認証(実はcookieベース)について説明します.コードを見てみましょう.
ネーミングスペースの導入
using System.Web.Security;
Users ModelUser = new Users() { ID = 10000, Name = UserName, UserName = UserName, PassWord = PassWord, Roles = "admin" };//    
string UserData = SerializeHelper.Instance.JsonSerialize(ModelUser);//       

//
FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket(1, UserName, DateTime.Now, DateTime.Now.AddHours(12), false, UserData); HttpCookie Cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(Ticket));// , Cookie Response.Cookies.Add(Cookie);

現在、アイデンティティ情報はクッキーに保存されていますが、シーンで現在のユーザーのユーザーIDや他の情報が必要な場合はどうすればいいですか?
では、クッキーでアイデンティティ情報を再取得し、復号してユーザーエンティティに逆シーケンス化すればOKです.
        /// 
        ///         
        /// 
        /// 
        public Users GetUser()
        {
            if (HttpContext.Current.Request.IsAuthenticated)//        
            {
                HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];//  cookie
                FormsAuthenticationTicket Ticket = FormsAuthentication.Decrypt(authCookie.Value);//  
                return SerializeHelper.Instance.JsonDeserialize(Ticket.UserData);//    
            }
            return null;
        }

2、権限検証

这里用到的是MVC中的action拦截器(重写OnActionExecuting),在action执行之前会先运行拦截器中的代码。这里同时可以身份验证是否过期。

    /// 
    ///     
    /// 
    public class AuthAttribute : ActionFilterAttribute
    {
        /// 
        ///     
        /// 
        public string Code { get; set; }

        /// 
        ///     (action         )
        /// 
        /// 
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //        
            if (!HttpContext.Current.User.Identity.IsAuthenticated)
            {
                ContentResult Content = new ContentResult();
                Content.Content = string.Format("alert('    !');window.location.href='{0}';", FormsAuthentication.LoginUrl);
                filterContext.Result = Content;
            }
            else
            { 
                string[] Role = CheckLogin.Instance.GetUser().Roles.Split(',');//      
                if (!Role.Contains(Code))//    
                {
                    //     
                    ContentResult Content = new ContentResult();
                    Content.Content = "alert('       !');history.go(-1);";
                    filterContext.Result = Content;
                }
            }
        }
    }

那么在action中怎么去调用呢?这里贴出HomeController中的代码来看下。

    public class HomeController : BaseController
    {
        [AuthAttribute(Code = "admin")]//    (  action   admin  )
        public ActionResult Index()
        {
            Users ModelUser = CheckLogin.Instance.GetUser();
            return View(ModelUser);
        }

        [AuthAttribute(Code = "user")]//     
        public ActionResult Index2()
        {
            return View();
        }

        [AuthAttribute(Code = "admin")]//
        public ActionResult Index3()
        {
            return View();
        }
    }

これでactionに権限を制御できます.

3、異常処理


上のHomeControllerはControllerを継承するのではなく、私たちが定義したBaseControllerを継承しています.では、BaseControllerに何が書かれているか見てみましょう.
    [ErrorAttribute]
    public class BaseController : Controller
    {
        //  Controller   BaseController,         
    }

ここでBaseControllerは、ErrorAttributeのエラーブロッカーを1つ追加しただけで、Controllerで発生した異常がErrorAttributeで処理される限り、データベースなどに記録することができます.では、ErrorAttributeがどのように働いているかを見てみましょう. /// /// (Controller ) /// public class ErrorAttribute : ActionFilterAttribute, IExceptionFilter { /// /// /// /// public void OnException(ExceptionContext filterContext) { // Exception Error = filterContext.Exception; string Message = Error.Message;// string Url = HttpContext.Current.Request.RawUrl;// filterContext.ExceptionHandled = true; filterContext.Result = new RedirectResult("/Error/Show/");// } }
ここでは異常をキャプチャし、フレンドリーなエラープロンプトページにジャンプできます.MVCではいくつかの操作がこのように簡単に完了し、コードについては文章の下でダウンロードを提供します.
 
インスタンスコード