2014-10-21 2 views
3

Я пытаюсь реализовать страницу с ошибкой отказа в доступе в новом проекте ASP.NET MVC 5 с режимом аутентификации индивидуальных учетных записей пользователей. добавить CustomAuthorize класс, который наследует от AuthorizeAttributeASP.NET MVC 5 Обращение с запросом на отказ от авторизации

public class CustomAuthorize : AuthorizeAttribute 
{ 
    protected virtual CustomPrincipal CurrentUser 
    { 
     get { return HttpContext.Current.User as CustomPrincipal; } 
    } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.IsAuthenticated) 
     { 
      if (!string.IsNullOrEmpty(Roles)) 
      { 
       if (!CurrentUser.IsInRole(Roles)) 
       { 
        filterContext.Result = new RedirectToRouteResult(
         new RouteValueDictionary(new { controller = "Error", action = "AccessDenied" })); 

        //base.OnAuthorization(filterContext); // returns to login url 
       } 
      } 

      if (!string.IsNullOrEmpty(Users)) 
      { 
       if (!Users.Contains(CurrentUser.UserName)) 
       { 
        filterContext.Result = new RedirectToRouteResult(
         new RouteValueDictionary(new { controller = "Error", action = "AccessDenied" })); 

        //base.OnAuthorization(filterContext); // returns to login url 
       } 
      } 
     } 
    } 


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

добавить ErrorController.cs

public class ErrorController : Controller 
{ 
    public ActionResult AccessDenied() 
    { 
     return View(); 
    } 
} 

и AccessDenied.cshtml Просмотреть

<h2>Access Denied</h2> 
<p>You do not have access to view this page</p> 

затем применяется в HomeController.cs

[CustomAuthorize] 
public class HomeController : Controller 

, но он всегда перенаправляется на страницу входа. Как отобразить страницу отказа в доступе?

+0

ли перенаправление идентифицированных пользователей «TestRole» на странице входа в систему в качестве Что ж? – takemyoxygen

+0

@takemyoxygen Да, но мне нужно перенаправить на страницу AccessDenied – Willy

+0

Я могу подтвердить, что ничего не случилось с вашими контроллерами CustomAuthorize или Error, поскольку я тестировал это в шаблоне mvc 5 с отдельными учетными записями пользователей. Проверьте мой ответ. – DSR

ответ

1

Создайте новый проект mvc 5 с индивидуальными учетными записями пользователей, добавьте свой класс атрибутов Error, View и CustomAuthorize.

Затем обновите домашний контроллер, как показано ниже.

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    [CustomAuthorize(Roles = "TestRole")] 
    public ActionResult About() 
    { 
     ViewBag.Message = "Your application description page."; 

     return View(); 
    } 

    public ActionResult Contact() 
    { 
     ViewBag.Message = "Your contact page."; 

     return View(); 
    } 
} 

Регистрация и Логин, попробуйте нажать на ссылке О вы получите перенаправлены на доступ запрещен страницы, поскольку нет ни одного пользователя с ролью

+0

Я вижу, спасибо ... – Willy

+1

Извините, я забыл добавить метод OnAuthorization в классе CustomAuthorize. Если этот метод существует, он никогда не достигнет 'HandleUnauthorizedRequest'. – Willy

+0

Да, вы правы, вам нужно обработать его внутри OnAuthorization. И вам может потребоваться изменить код состояния на 401. – DSR

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