2015-07-31 2 views
0

У меня есть пользовательский класс authorize атрибута, где мне нужно перенаправить на действия, который украшен ChildActionOnly атрибута, когда пользователь не авторизован,MVC4 перенаправлять метод ChildActionOly из C# метод

public override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    HttpContextBase context = filterContext.RequestContext.HttpContext; 
    if (context.User.Identity.IsAuthenticated) 
    { 
     var user = AppData.CurrentUser; 
     if (string.IsNullOrEmpty(user.GroupName)) 
     { 
      filterContext.Result = new RedirectResult("~/Error/Unauthenticated"); 
     } 
    } 
} 

и контроллер ошибки

[AllowAnonymous] 
[ChildActionOnly] 
public class ErrorController : Controller 
{ 
    public ActionResult Unauthorized() { return View(); } 
    public ActionResult Unauthenticated() { return View(); } 
} 

я получаю ошибка приложения

The action 'Unauthorized' is accessible only by a child request. 
+1

вы не можете перенаправлять на дочернее действие, дочерние действия могут быть вызваны только в строках из других представлений с помощью Action или RenderAction, если вы хотите, чтобы вы могли возвращать ViewResult, указывающие на представления ошибок – BhavO

+0

Мне просто нужно выполнить действие контроллера ошибки вызываться изнутри приложения, а не из браузера. есть ли другой способ сделать это? – Jag

+1

Переадресация * есть * из браузера, а не из приложения. –

ответ

0

Почему так опасно, что пользователь может перейти к действию Unauthorized, если вы удаляете атрибут [ChildActionOnly]? В худшем случае они не получают информацию о том, какую страницу они не должны видеть, поскольку они не перенаправляются с этого контроллера/действия, которое перенаправляет их на это несанкционированное представление. В нормальном случае, когда пользователь не авторизован, они отправляются на страницу входа с реферером в качестве параметра url, поэтому они могут быть отправлены обратно, как только они авторизуются, возможно, здесь не вариант?

Сказав это, вы могли бы с кодом отправить TempData, когда произошла ошибка. TempData - объект с ключом/стоимостью, который сохраняется в пределах перенаправления, поэтому отправьте специальное значение, которое вы проверяете (см. MSDN).

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