Пользовательская авторизация - PullRequest
2 голосов
/ 01 ноября 2010

Я пытаюсь использовать собственную авторизацию, создав базовый контроллер и переопределив метод OnAuthorization.

Он работает нормально, когда авторизация не проходит, но я получаю страницу 401, когда мои проверки успешны (но по умолчаниюпроверки авторизации не пройдены).

    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        var roleAttribute = typeof(AuthorizeAttribute);
        var attributes = filterContext.ActionDescriptor.GetCustomAttributes(roleAttribute, true);
        if (attributes.Length == 0)
            attributes = GetType().GetCustomAttributes(roleAttribute, true);
        if (attributes.Length == 0)
            return;

        MvcHelper.Authenticate();


        foreach (AuthorizeAttribute item in attributes)
        {
            if (!Thread.CurrentPrincipal.IsInRole(item.Roles))
            {
                filterContext.Result = new RedirectResult("~/Error/Unauthorized/" + "?MissingRole=" + item.Roles);
                return;
            }
        }

        //how do I prevent the default authorization here?
    }

Я пробовал с filterContext.HttpContext.SkipAuthorization = true;, но это не помогает.

Ответы [ 2 ]

0 голосов
/ 08 августа 2011

Я бы сделал это в два этапа:

  • Сначала я бы обезопасил все приложение, чтобы вы явно указали белый список тех контроллеров, которые должны быть доступны анонимным пользователям, прочитайте раздел «ОграничениеПодход LogonAuthorize filter "on http://blogs.msdn.com/b/rickandy/archive/2011/05/02/securing-your-asp-net-mvc-3-application.aspx. Там есть один фильтр, который вы применяете глобально для ограничения доступа к вашему приложению, и один атрибут, который вы применяете к тем действиям, к которым вы хотите разрешить анонимный доступ.
  • Следующим шагом будет внедрение другого фильтра, который вы применяете к тем действиям, в которых вы хотите, чтобы у пользователя была определенная роль или способность.Этот фильтр будет наследоваться от AuthorizeAttribute.
0 голосов
/ 08 августа 2011

Я обычно делаю это в ActionFilter: https://gist.github.com/e297b435ceb8f022fb95

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (filterContext == null)
        throw new ArgumentNullException("FilterContext");

    if (AuthProvider == null)
        throw new ArgumentNullException("IAuthProvider");

    if (AuthProvider.Authenticate(filterContext) == false)
    {
        var req = filterContext.HttpContext.Request;

        var response = filterContext.HttpContext.Response;
        response.StatusCode = 401;
        response.AddHeader("WWW-Authenticate", "Basic realm=\"Emergidata\"");
        response.End();
    }
    else
    {
        var controller = filterContext.Controller as IAppController;
        controller.DynamicSession= AuthProvider.AuthProviderContext;
    }
}
...