有的页面需要用户认证之后才可以进入,通常都是在Filter的OnActionExecuting方法中我们需要获取当前用户。有两种情况不必登录:1.用户是登录的,也就是认证过的。2.用户上次登录了,但没有退出就关闭了页面,且还Cookie还没有过期。这个时候
Request.IsAuthenticated=true
所以用户不必再登录。
如果用户退出,也就是调用SignOut()
public void SignOut() { _cachedUser = null; FormsAuthentication.SignOut(); }
这个时候获取不到认证用户。
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; } }