2016-08-29 3 views
0

im с использованием фильтра действий для выполнения одной работы в моем проекте. Я хочу сделать это, если ip пользователя равен моему ip, он пойдет в индекс без просмотра страницы входа. Если его ip отличается, я хочу перенаправить его на страницу входа. На странице входа я спрашиваю пароль и идентификатор. У меня проблема с перенаправлением на страницу входа. Вот его мой код, как я могу исправить этот цикл?OnActionExecuting Loop MVC

ФИЛЬТР

public class IntranetAction : ActionFilterAttribute 
{ 
    private const string LOCALIP = "192.168"; 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var request = filterContext.RequestContext.HttpContext.Request; 

     string ip1 = request.UserHostAddress; 
     string shortLocalIP; 
     if (ip1 != null && ip1.Contains(".")) 
     { 
      string[] ipValues = ip1.Split('.'); 
      shortLocalIP = ipValues[0] + "." + ipValues[1]; 
     } 
     else 
     { 
      shortLocalIP = "192.168"; 
     } 

     //var ip2 = request.ServerVariables["LOCAL_ADDR"]; 
     //var ip3 = request.ServerVariables["SERVER_ADDR"]; 

     if (shortLocalIP != LOCALIP) 
     { 

      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new 
      { 
       controller = "Login", //TODO - Edit as per you controller and action 
       action = "User" 
      })); 

     } 
     else 
     { 
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new 
      { 
       controller = "Home", //TODO - Edit as per you controller and action 
       action = "Index" 
      })); 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 

Войти Контроллер

public class LoginController : Controller 
{ 
    // GET: Login 
    [IntranetAction] 
    public ActionResult User() 
    {   
     return View(); 
    } 


    public void checkAuthentication(UserLoginInfo loginInfo) 
    {   
     bool isAuthenticated = new LdapServiceManager().isAuthenticated(loginInfo); 
     if (isAuthenticated) 
     { 

      //HttpContext.Response.Redirect("/Home/Index"); 
      Response.Redirect("/Home/Index"); 
      Response.End(); 
     } 
     else 
     { 
      Response.Redirect("/", false); 
     }   
    } 
} 

Этот цикл в моем классе фильтра. shortLocalIP не соответствует моему LOCALIP, он переходит на мою страницу входа, но он переходит в inf loop

+1

Снимите '[IntranetAction]' атрибут из вашего 'User)' метода –

+0

(Но если я удалить этот атрибут, мой код не работает. Он всегда перенаправляется на мою страницу входа. – Berkin

+0

Ваш атрибут должен быть включен во все другие методы. В настоящее время происходит переход к методу 'User()', который запускает фильтр, который перенаправляет на метод 'User()', который запускает фильтр, который перенаправляет на метод 'User()', который ...... .. –

ответ

1

Я думаю, вам нужно другое представление Index в контроллере входа.

Если и your ip равны Перейти к Home/Index в противном случае перейдите на страницу Login/Index.

Ваш startup вид будет Login/User, где будут размещены ваши filter.

public class IntranetAction : ActionFilterAttribute 
{ 
    private const string LOCALIP = "192.168"; 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var request = filterContext.RequestContext.HttpContext.Request; 

     string ip1 = request.UserHostAddress; 
     string shortLocalIP; 
     if (ip1 != null && ip1.Contains(".")) 
     { 
      string[] ipValues = ip1.Split('.'); 
      shortLocalIP = ipValues[0] + "." + ipValues[1]; 
     } 
     else 
     { 
      shortLocalIP = "192.168"; 
     } 

     //var ip2 = request.ServerVariables["LOCAL_ADDR"]; 
     //var ip3 = request.ServerVariables["SERVER_ADDR"]; 

     if (shortLocalIP != LOCALIP) 
     { 

      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new 
      { 
       controller = "Login", //TODO - Edit as per you controller and action 
       action = "Index" 
      })); 

     } 
     else 
     { 
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new 
      { 
       controller = "Home", //TODO - Edit as per you controller and action 
       action = "Index" 
      })); 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 
+0

. Я не понимаю, почему я должен использовать другой :(Если я использую второе представление, это будет то же самое, что и текущий – Berkin

+0

Нет, если вы используете другой, только те пользователи увидят, что IP-адрес отличается от вас. – Mairaj

Смежные вопросы