7

У меня есть фильтр действий CustomeAuthorize, который перенаправляет пользователя на страницу подписания, если пользователь не аутентифицирован. Я применяю этот фильтр к действиям или контроллерам.ASP.NET MVC - действие фильтра CustomeAuthorize с использованием внешнего веб-сайта для входа в систему пользователя

[CustumeAuthorize] 
public ActionResult MyAction() 
{ 
    //do something here 
    return View(); 
} 

и фильтр выглядит следующим образом:

public class CustomAuthorizeAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 

     if (!currentUserIsAuthenticated) 
     { 

      filterContext.Result = 
       new RedirectToRouteResult(
        new RouteValueDictionary{{ "controller", "Account" }, 
               { "action", "SignIn" }, 
               { "returnUrl", filterContext.HttpContext.Request.RawUrl } 
               }); 
     } 
     else 
     { 
      base.OnActionExecuting(filterContext); 
     } 
    } 
} 

После того, как я присвоить значение filterContext.Result, после выполнения фильтра отделки, то исполнение (как-то ?!) перенаправляется к действию для входа в аккаунт и MyAction не выполняется. Это именно то, чего я хочу.

Теперь предположим, что я хочу изменить CustomAuthorize для аутентификации пользователя на внешний веб-сайт и не мое собственное действие для входа в аккаунт, так что я делаю что-то вроде этого:

public class CustomAuthorizeAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 

     if (!currentUserIsAuthenticated) 
     { 
      filterContext.HttpContext.Response.Redirect("http://externalSite.com/login?returnUrl=" + filterContext.HttpContext.Request.RawUrl); 
     } 
     else 
     { 
      base.OnActionExecuting(filterContext); 
     } 
    } 
} 

Моя проблема заключается, что после выполнения второй версии фильтра CustomAuthorize завершена, выполнение продолжается до MyAction, чего я не хочу! Как остановить выполнение MyAction после фильтра в этом случае?

-Update- Я только что наткнулся на новую проблему. Мой MVC приложение находится в плавающем фрейме, и я хочу Переадресовывание, чтобы заставить текущий кадр в качестве основного кадра после перенаправления, так что я делаю что-то вроде:

string url = "http://externalSite.com/login?returnUrl=" + filterContext.HttpContext.Request.RawUrl; 
filterContext.HttpContext.Response.Write("<script type=\"text/javascript\">\ntop.location.href = \"" + url + "\";</script>"); 

Есть ли способ передать JavaScript для RedirectResult() ?

ответ

11

Используйте RedirectResult, аналогично тому, как вы использовали RedirectToRouteResult, прежде чем заменить результат в контексте фильтра.

filterContext.Result = new RedirectResult("http://externalSite.com/login?returnUrl=" + filterContext.HttpContext.Request.RawUrl); 
+1

Спасибо за подсказку. Я только что наткнулся на новую проблему. Мое приложение MVC находится в iFrame, и я хочу, чтобы Redirect принудительно запустил текущий кадр в качестве основного кадра после перенаправления, поэтому я делаю что-то вроде: filterContext.HttpContext.Response.Write (""); Есть ли способ передать javascript для RedirectResult()? – xraminx

+0

Возможно, вы захотите попробовать передать реальный вид, содержащий правильный Javascript, чтобы сделать перенаправление. Существует также JavaScriptResult, который вы можете попробовать. Я не использовал это. – tvanfosson

+0

JavaScriptResult напишет возвращенный javascript в пределах

 блока! Не знаю, почему. Я просто сделал фиктивное действие, сделал только пересылку для меня и направил это действие так же, как и в первом случае, продемонстрированном выше. Спасибо за вашу помощь :) –
                        
                            
    xraminx
                                
                            
                        
                    

1

Позвольте мне понять, если я понимаю - у вас есть iFrame и выполняется действие внутри этого iFrame. Вы хотите перенаправить на родительскую страницу, а не внутри этого iFrame?

Если это так, просто используйте Redirect (url) в своем действии.

+0

Перенаправление (url) из iFrame просто помещает URL-адрес в iFrame. – Dronz

0

Вы можете добавить оценку jQuery на страницу входа в систему.

$(function() { 
     if (window != top) { 
      top.location.href = location.href; 
     } 
    }); 

ИЛИ

редактировать 'filterContext.Result' в действии 'OnActionExecuting'

filterContext.Result = new ContentResult() { Content = "<script>top.window.location.href='/user/Login'</script>" }; 
Смежные вопросы