2012-03-04 69 views
0

嗨,检查MVC中每个请求上是否存在用户?

我需要检查,如果登录的用户做仍然存在于数据库中,如果不是我需要重定向到另一个网页。

财产以后这样的:

if (AccountHandler.Instance.UserIdentityName.Length > 0) 
    { 
     AccountModel accountModel = new AccountModel(); 

     if (!accountModel.AccountExists(AccountHandler.Instance.UserIdentityName)) 
     { 
      FormsAuthentication.SignOut(); 
      HttpContext.Current.Items[HttpContextKey.UserContext.ToString()] = null; 
      return Redirect(Request.UrlReferrer.PathAndQuery); 
     } 
    } 

如何做到这一点的ASP.NET MVC?我已经尝试过Global.asax Application_BeginRequest,但是这会针对每个请求触发,所以不应该在这里放置重定向。

回答

2

我会建议全球行动过滤器将是最合适的方式来做到这一点。另一种方法是使用在OnActionExecuting中实现的基础控制器。

创建一个派生自ActionFilterAttribute的类。将其添加到global.asax.cs中的全局过滤器。让它重写OnActionExecuting并在那里实现代码。

public RequireValidUserAttribute: ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (AccountHandler.Instance.UserIdentityName.Length > 0) 
     { 
      AccountModel accountModel = new AccountModel(); 

      if (!accountModel.AccountExists(AccountHandler.Instance.UserIdentityName)) 
      { 
       FormsAuthentication.SignOut(); 
       filterContext.HttpContext.Items[HttpContextKey.UserContext.ToString()] = null; 
       filterContext.Result = new RedirectResult { Url = Request.UrlReferrer.PathAndQuery }; 
      } 
     } 
    } 
} 
+0

这是可能的MVC2,如果是这样,如何? – Banshee 2012-03-04 15:49:37

+0

我不认为全局过滤器在MVC2中可用。我想,你必须去那里的基地控制器路线。如果可以的话,值得升级到MVC3。请注意,它基本上是在不同位置实现的相同代码,并且您必须记住从基本控制器派生并调用基本行为(如果在子控制器中覆盖该方法)。 – tvanfosson 2012-03-04 15:55:20