2013-10-24 3 views
1

Положите [Authorize (Roles = "admin")] на просмотр, он работает, поскольку пользователь перенаправляется, однако они всегда перенаправляются на вход в систему, несмотря на то, что они уже вошли в систему. Как я могу изменить это значит, что он переходит на страницу с ошибкой или что-то подобное?MVC Авторизовать роли переходит в режим входа в систему?

+0

Когда это перенаправление произойдет? –

+0

Ну, я просто поставил Authorize над представлением контроллера, я хочу сделать доступным только для определенных ролей, поэтому всякий раз, когда этот URL-адрес действительно доступен. На данный момент переход на этот маршрут, а не в роли возвращает вид входа? – user1166905

+0

Возможный дубликат [Как я могу выполнить поиск по неавторизованной странице, если пользователь не находится в Авторизованных ролях?] (Http://stackoverflow.com/questions/2322366/how-do-i-serve-up-an-unauthorized -page-when-a-user-is-not-in-author-role) – CodeCaster

ответ

1

вы можете создать атрибут пользовательских авторизовать как этого

public class CustomAuthorize : AuthorizeAttribute 
    { 

     protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
     { 
      if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
      { 
       base.HandleUnauthorizedRequest(filterContext); 
      } 
      else 
      { 
       filterContext.Result = new RedirectToRouteResult(new 
       RouteValueDictionary(new { controller = "Home", action = "UnAuthorized" })); 

      } 
     } 
    } 

и использовать его как этот

[CustomAuthorize(Roles="admin")] 

Надеется, что это помогает

+0

Я буквально положил свой ответ одновременно с этим, но это в основном то, чем я был, поэтому я буду отмечать ваше мнение как правильно. – user1166905

+0

Из интереса вы бы рекомендовали использовать RedirectToRouteResult поверх RedirectResult? Если да, то почему? – user1166905

+0

Я не эксперт, но у меня были проблемы с «RedirectResult» во время повторного факторинга из-за жестко заданных путей. –

0

Вместо дубликат предложил я код от вопроса : Prevent FormsAuthenticationModule of intercepting ASP.NET Web API responses и модифицировано соответствующим образом:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] 
public class AuthorizeCustom : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.IsAuthenticated) 
     { 
      filterContext.Result = new RedirectResult("/Error/Unauthorized"); 
     } 
     else 
     { 
      if (filterContext.HttpContext.Request.IsAjaxRequest()) 
      { 
       filterContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true; 
      } 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 
} 

Затем просто создал представление для маршрута «/ Ошибка/Несанкционированный» и изменил атрибут [Авторизовать] на [AuthorizeCustom]. Теперь неавторизованные пользователи будут перенаправлены на логин, как ожидалось, и люди, не принадлежащие к ролям, перенаправляются на пользовательское представление.

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