asp.Netmvcフィルタの基本方法



asp.Netmvcのフィルタはとても使いやすいもので、ログインと権限検証に使われるのが最も一般的な使い方です.具体的な実現方法があります.資料を探すのは難しいです.今、よく使われている記録を取って、参考にしてください.
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
    public sealed class LoginFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var session = filterContext.HttpContext.Session;
            var request = filterContext.HttpContext.Request;
            var response = filterContext.HttpContext.Response;
            var user = session["Account"] as Account;
            if (user == null)
            {//   ,         
                var token = Cookies.ReadCookie("remembermetoken");
                Guid r = Guid.Empty;
                if (Guid.TryParse(token, out r))
                {
                    var account = Account.GetAccountByRememberMeToken(r);
                    if (account == null)
                    {
                        if (string.IsNullOrWhiteSpace(request["submitTime"]))
                        {
                            session.Clear();
                            Cookies.DeleteCoookie();
                            filterContext.Result = new JsonResult() { Data = new ReturnMsg(MessageType.LoginExpire) };
                        }
                        else
                        {
                            filterContext.Result = new RedirectResult(request.Url.Scheme + "://" + request.Url.Authority);
                        }
                    }
                    else
                    {//remember me     
                        //           ,           
                        session["AccountId"] = account.id.ToString();
                        session["Account"] = account;
                        filterContext.Controller.ViewBag.User = account;
                    }
                }
                else
                {
                    if (string.IsNullOrWhiteSpace(request["submitTime"]))
                    {
                        filterContext.Result = new RedirectResult(request.Url.Scheme + "://" + request.Url.Authority);
                    }
                    else
                    {
                        filterContext.Result = new JsonResult() { Data = new ReturnMsg(MessageType.LoginExpire) };
                    }
                }
            }
            else
            {
                filterContext.Controller.ViewBag.User = user;
            }
        }
        [ValidateInput(false)]
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            var request    = filterContext.HttpContext.Request;
            var session    = filterContext.HttpContext.Session;
            var controller = filterContext.RouteData.Values["action"].ToString();
            var action     = filterContext.RouteData.Values["controller"].ToString();
            var model      = session["Account"] as Account;

            var log    = new VisitLog();
            log.IP     = HttpHelper.GetRealIPFromRequest(request);
            log.Url    = request.Url.AbsoluteUri;
            log.module = controller;
            log.page   = action;
            var pm     = "";
            for (int i = 0; i < request.Form.Count; i++)
            {
                pm += "&" + request.Form.Keys[i] + "=" + request.Form[i].Trim();
            }
            if (model != null)
            {
                log.AccountId = model.id;
            }
            log.Param = pm.Trim('&');
            log.Method = request.HttpMethod;
            VisitLog.Add(log);
        }
    }

 
この小段のコードは、字が珠玉で、内容が豊富で、フィルタ内でaspを取得することを含む.Netにオブジェクトを内蔵する方法、コントローラとターゲットメソッド名の取得、どのようにリダイレクトするか、jsonへの戻りを遮断するかなど、ログイン検証ロジック、アクセスログ記録、トップページへの戻り、rememberme機能の実現など、フィルタとして使用できるモデルとなります^^;