Если Controller.OnAuthorization () возвращает void, то как мне запретить доступ? - PullRequest
6 голосов
/ 23 июля 2011

Я ожидал, что он вернет 'true' или 'false' ...

Я переопределил OnAuthorization в моем контроллере и на основании отсутствующего или недействительного значения заголовка HTTP, которое я хочу вернуть 403 запрещено,однако я не могу понять, как вернуть что-либо из OnAuthorization, чтобы он фактически остановил работу остальной части контроллера.

Что мне делать?

Моя первая попытка нижебыл огромный сбой, я думаю, что Deny () работает, но ничего не происходит ...

public class AuthController : Controller
    {
        protected override void OnAuthorization(AuthorizationContext filterContext)
        {
            if (string.IsNullOrEmpty(filterContext.HttpContext.Request.Headers["Authorization"]))
                Deny();

            string authString = filterContext.HttpContext.Request.Headers["Authorization"];

            base.OnAuthorization(filterContext);
        }

        private ActionResult Deny()
        {
            HttpContext.Response.StatusCode = 403;

            return Content("Access Denied", "text/plain");
        }
    }

ОБНОВЛЕНИЕ похоже, что это добилось цели, любая причина, почему это может быть плохим подходом?

    if (string.IsNullOrEmpty(filterContext.HttpContext.Request.Headers["Authorization"]))
    {
        filterContext.Result = Content("Access Denied", "text/plain");
        filterContext.HttpContext.Response.StatusCode = 403;

        base.OnAuthorization(filterContext);
    }

ВНОВЬ ОБНОВЛЕНО хорошо, так что теперь это вообще не работает ... Я установил точку останова и наблюдал, как она входит в оператор if и попадает в базу. OnAuthorization(...) вызовите и снова вернитесь назад ... зачем ему переходить в оператор if, если он не выполняется?Если это выполнялось, почему бы вызывать base.OnAuthorization (...) не заканчивать вещи рано?

Ответы [ 5 ]

8 голосов
/ 29 июля 2011

Вы можете выбросить httpexception:

throw new HttpException(403, "Access Denied");
4 голосов
/ 02 сентября 2011

А как же?

throw new UnauthorizedAccessException();
1 голос
/ 17 августа 2011

Другой подход к защите приложения: Защита вашего приложения ASP.NET MVC 3

0 голосов
/ 08 июля 2014

На самом деле, когда контроллер вызывается для ActionResult, страница ожидает просмотра. Вы могли бы реализовать следующий пользовательский интерфейс, чтобы пользователь лучше понимал:

//code for checking whether authorized goes here...//
bool isAuthorised = SomeFunction();
if (!isAuthorised)
{
    var viewData = new ViewDataDictionary();
    viewData.Add("Message", "You do not have sufficient privileges for this operation.");
    filterContext.Result = new ViewResult { ViewName = "Unauthorized", ViewData = viewData };
    //The View "Unauthorized" is merely a View page that could inherit from a master View or none,       
    //and could be situated in your Views\Shared folder.
    //And you can present the message in the View page like this or so: 
    //<div style="color:Red; font-size:12pt; font-weight:bold;"> <%:ViewData["Message"] %></div>
}
return;

Представлением «Неавторизованный» может быть любое имя, которое вам нужно, и оно должно находиться в папке «Общий вид».

0 голосов
/ 30 мая 2014

как насчет использования маршрута следующим образом:

filterContext.Result.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Message", action = "AccessDenied" }));

:)

...