2014-04-08 31 views
5

Sorun Bildirimi Yönlendirme Döngü istisna veren: Ben oturumun süresi veya eğer Giriş sayfasına kullanıcıyı yönlendirmek için çalışıyorumuygulanması eylem filtre küresel MVC

kullanıcı jilet kullanarak MVC 4 giriş yapmadan herhangi görünümü erişmeye çalıştığında . Bunun yerine ben gayet iyi çalışıyor her eylem yöntemleri için filtre özelliğini kullanırsanız filter.config dünya çapında eylem filtre uygulama

  • .
  • Bu eylem filtresini, her eylem yöntemine uygulamak istemiyorum.

Genel olarak global olarak uygulamak istiyorum.Yeniden küresel olarak eylem filtresi uygulayarak yeniden yönlendirme döngüsünden kaçınmak için ?? Bu nasıl elde edilir?

Girişi Denetleyici:

//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); 
} 

Filtreler (Eylem Filtre):

[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); 
    } 
} 

Filtre Config.cs:

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

cevap

3

[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); 
    } 
} 
: Sen kontrolör Girişi ve eylem Endeksi olduğunda filtre mantığını çalıştıran yapmayıbırakabilirsen