Почему мой переопределенный OnAuthorization не возвращает filterContext.Result, который я установил? - PullRequest
3 голосов
/ 26 июля 2011

Вот код для моего базового контроллера, идея в том, что если строка авторизации отсутствует в заголовках HTTP, мы их исключаем.Я клянусь, что это работало должным образом, и теперь внезапно это не работает.Как ни странно, когда я отлаживаю, он фактически переходит в оператор if, так что действительно верно, что запрашиваемый мной заголовок HTTP является строкой NULL OR EMPTY, ОДНАКО, он не завершается досрочно и возвращает 403 Access Denied больше ... он работалхорошо, и внезапно это просто игнорирует все это и в конечном итоге приводит к сбою в приложении, когда я пытаюсь проанализировать строку авторизации, которая не была найдена.

public class AuthController : Controller
    {
        protected int AccountID;

        protected override void OnAuthorization(AuthorizationContext filterContext)
        {
            //if no authorization string is provided, access denied
            if (string.IsNullOrEmpty(filterContext.HttpContext.Request.Headers["Authorization"]))
            {
                filterContext.Result = Content("Access Denied", "text/plain");
                filterContext.HttpContext.Response.StatusCode = 403; //forbidden


                base.OnAuthorization(filterContext);
            }

            //otherwise grab the authorization string and validate it
            string authString = filterContext.HttpContext.Request.Headers["Authorization"];
            string urlPath = string.IsNullOrEmpty(filterContext.HttpContext.Request.Path) ? "" : filterContext.HttpContext.Request.Path;
            int getAccountID = 0;

            //if authorization fails...
            if (!AuthCore.Authorize(authString, urlPath, ref getAccountID))
            {
                filterContext.Result = Content("Access Denied", "text/plain");
                filterContext.HttpContext.Response.StatusCode = 403; //forbidden

                base.OnAuthorization(filterContext);
            }

            //AccountID will never be zero at this point
            AccountID = getAccountID;

            //carry on with Controller Action, request is valid and AccountID is known
            base.OnAuthorization(filterContext);
        }

ОБНОВЛЕНИЕ : простопробовал filterContext.Result = new HttpUnauthorizedResult ();вместо этого, те же результаты.Действие контроллера продолжается и выдает ошибку при попытке разобрать строку заголовка, которая не была найдена.

ОБНОВЛЕНИЕ 2 : добавлено «return;»после каждого из вызовов base.OnAuthorization (), кроме последнего, теперь, когда он терпит неудачу, я получаю 302, перемещенный из MVC, сопровождаемый 404, который оказывается приложением, пытающимся перенаправить на URL страницы входа по умолчанию, который на самом деле несуществует ... это может быть достаточно хорошо?Может быть, но я бы предпочел заблокировать это прямо, а не позволять некоторому шаткому перенаправлению произойти, поскольку способ блокировать их, не кажется мне безопасным.

Ответы [ 2 ]

1 голос
/ 26 июля 2011

АХ ГА!

Я вызывал base.OnAuthorization () слишком много раз, по-видимому, это на самом деле не постоянное прощание с потоком ... не уверен, почему я подумал, что теперь я об этом думаю ... вот рабочий код :

protected override void OnAuthorization(AuthorizationContext filterContext)
{
    int getAccountID = 0;

    //if no authorization string is provided, access denied
    if (string.IsNullOrEmpty(filterContext.HttpContext.Request.Headers["Authorization"]))
    {
        filterContext.Result = Content("Access Denied", "text/plain");
        filterContext.HttpContext.Response.StatusCode = 403; //forbidden
    }
    else
    {
        //otherwise grab the authorization string and validate it
        string authString = filterContext.HttpContext.Request.Headers["Authorization"];
        string urlPath = string.IsNullOrEmpty(filterContext.HttpContext.Request.Path) ? "" : filterContext.HttpContext.Request.Path;

        //if authorization fails...
        if (!AuthCore.Authorize(authString, urlPath, ref getAccountID))
        {
            filterContext.Result = Content("Access Denied", "text/plain");
            filterContext.HttpContext.Response.StatusCode = 403; //forbidden
        }
    }

    //AccountID will never be zero at this point
    AccountID = getAccountID;

    //carry on with Controller Action, request is valid and AccountID is known
    base.OnAuthorization(filterContext);
}
0 голосов
/ 17 августа 2011

Я думаю, вам следует проверить этот пост: Защита вашего приложения ASP.NET MVC 3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...