有的页面需要用户认证之后才可以进入,通常都是在Filter的OnActionExecuting方法中我们需要获取当前用户。有两种情况不必登录:1.用户是登录的,也就是认证过的。2.用户上次登录了,但没有退出就关闭了页面,且还Cookie还没有过期。这个时候

Request.IsAuthenticated=true

   所以用户不必再登录。

 Form认证的几点说明

  如果用户退出,也就是调用SignOut()

 public void SignOut()
        {
            _cachedUser = null;
            FormsAuthentication.SignOut();
        }

 这个时候获取不到认证用户。

Form认证的几点说明

Filter就会让用户返回到登录页面。

 var user = WorkContext.CurrentUser;
if (user == null)
 {
    filterContext.Result = new RedirectResult("~/Account/Logon?returnUrl=" + returnUrl);
  }

 另外,在Ninject中无法注入HttpContextBase,但可以讲其换成属性。

   public HttpContextBase HttpContext
        {
            get { return new HttpContextWrapper(System.Web.HttpContext.Current); }
        }

而对于Filter可以属性注入。

  [Inject]
  public IAuthenticationService AuthenticationService { get; set; }

LoginValidAttribute 源码:

 public class LoginValidAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// 转到管理员登陆的界面
        /// </summary>
        private bool _isAdmin;

        public LoginValidAttribute(bool isadmin = false)
        {
            _isAdmin = isadmin;
        }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var contr = filterContext.RouteData.Values["controller"].ToString();
            var action = filterContext.RouteData.Values["action"].ToString();
            var parmdatas = filterContext.ActionParameters;
            var parms = "?";
            var i = 0;
            var count = parmdatas.Count;
            foreach (var parmdata in parmdatas)
            {
                i++;
                if (i <= count - 1)
                {
                    parms += parmdata.Key + "=" + parmdata.Value + "&";
                }
                else
                {
                    parms += parmdata.Key + "=" + parmdata.Value;

                }
            }
            if (count == 0) parms = "";
            var returnUrl = string.Format("~/{0}/{1}{2}", contr, action, parms);
            returnUrl = UrlHelper.GenerateContentUrl(returnUrl, filterContext.HttpContext);

            var user = WorkContext.CurrentUser;
            if (user == null)
            {
                filterContext.Result = new RedirectResult("~/Account/Logon?returnUrl=" + returnUrl);
            }

            // 如果已经登录 但不是角色,就需要跳转到只是页面 提示是管理员才能登录

        }

        [Inject]
        public IWorkContext WorkContext { get; set; }

    }
View Code

相关文章: