2014-04-08 20 views
5

Vấn đề Bản Tuyên Bố:Áp dụng bộ lọc hành động toàn cầu cho Redirect Vòng ngoại lệ trong MVC

Tôi đang cố gắng để chuyển hướng người dùng đến trang đăng nhập nếu phiên hết hạn hoặc nếu người dùng cố gắng truy cập vào bất kỳ quan điểm mà không cần đăng nhập MVC 4 sử dụng dao cạo .

  • Thay vì áp dụng bộ lọc tác vụ trên toàn cầu trong filter.config nếu tôi sử dụng thuộc tính lọc cho mọi phương thức hành động hoạt động tốt.
  • Tôi không muốn áp dụng bộ lọc hành động này cho mỗi và mọi phương thức hành động .

Tôi muốn áp dụng nó trên toàn cầu.Làm thế nào để tránh vòng chuyển hướng bằng cách áp dụng bộ lọc hành động trên toàn cầu ?? Làm thế nào để đạt được điều này?

điều khiển Login:

//Get Method 
public ActionResult Index(string returnUrl) 
{ 
    ViewBag.ReturnUrl = returnUrl; 
    return View(); 
} 

//Post Method 
[HttpPost] 
public ActionResult Index(LoginModel loginModel, string returnUrl) 
{ 
    if (ModelState.IsValid) 
    { 
     objLoginDC.LoginID = loginModel.LoginID; 
     objLoginDC.Password = loginModel.Password; 
     if (objSvcMasterConfig.IsValid(objLoginDC)) 
     { 
      var varLoginTenantUserDetails = objSvcMasterConfig.GetLoginUserDetails(objLoginDC); 
      Session["User"] = varLoginUserDetails[0]; 
      FormsAuthentication.SetAuthCookie(objLoginDC.LoginID, objLoginDC.RememberMe); 

      return RedirectToLogin(returnUrl); 
     } 
     else 
     { 
      ModelState.AddModelError("", "The Log In ID or Password provided is incorrect."); 
     } 
    } 

    return View(loginModel); 
} 

lọc (Filter Action):

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public class CheckUserSessionAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     HttpSessionStateBase session = filterContext.HttpContext.Session; 
     var user = session["User"]; 

     if (((user == null) && (!session.IsNewSession)) || (session.IsNewSession)) 
     { 
      session.RemoveAll(); 
      session.Clear(); 
      session.Abandon(); 

      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Login" }, { "action", "Index" } }); 
     } 
     base.OnActionExecuting(filterContext); 
    } 
} 

Lọc Config.cs:

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
     filters.Add(new Filters.CheckUserSessionAttribute()); 
    } 
} 

Trả lời

3

Bạn có thể thử không thực hiện luận lý bộ lọc của bạn khi điều khiển là Đăng nhập và hành động là Index:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public class CheckUserSessionAttribute : ActionFilterAttribute 
{ 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     //do not execute the filter logic for Login/Index 
     if (filterContext.RouteData.GetRequiredString("controller").Equals("LogIn", StringComparison.CurrentCultureIgnoreCase) 
      && filterContext.RouteData.GetRequiredString("action").Equals("Index", StringComparison.CurrentCultureIgnoreCase)){ 
      return; 
     } 

     HttpSessionStateBase session = filterContext.HttpContext.Session; 
     var user = session["User"]; 

     if (((user == null) && (!session.IsNewSession)) || (session.IsNewSession)) 
     { 
      session.RemoveAll(); 
      session.Clear(); 
      session.Abandon(); 

      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Login" }, { "action", "Index" } }); 
     } 
     base.OnActionExecuting(filterContext); 
    } 
} 
Các vấn đề liên quan