Подтвердить что ты не робот

HandleUnauthorizedRequest не переопределяет

В моем приложении mpc3 asp.net у меня есть настраиваемый атрибут авторизации, как показано ниже.

public class CustomAuthorize : AuthorizeAttribute
{
    public IAccountRepository AccountRepository { get; set; }

    public CustomAuthorize()
    {
        this.AccountRepository = new UserModel();
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        base.AuthorizeCore(httpContext);
        return AccountRepository.isEnabled(HttpContext.Current.User.Identity.Name);
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    {
        base.HandleUnauthorizedRequest(filterContext);
    }
}

У меня есть тег [CustomAuthorize] для моих действий с контроллером, а метод AuthorizeCore работает нормально - он выполняет логику, в которой я хочу (убедитесь, что учетная запись действительно включена), а затем возвращается как таковая.

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

Что мне не хватает?

EDIT: Я сделал еще несколько исследований и нашел несколько других людей, у которых была эта проблема, но к сожалению не было.

EDIT2: Пример кода

[CustomAuthorize]
public class UserController: Controller
{
    public UserController() 
    {
        //do stuff here
    }
}

ИЗМЕНИТЬ 3: @Fabio

Вот что я пытаюсь сделать. У меня есть страница входа в систему (формы auth), которая работает нормально - она ​​вызывает мой пользовательский логин, а затем вызывает мой авторизатор AuthorizeCore. Мое приложение использует большое количество вызовов ajax, и моя конечная цель - всякий раз, когда пользователь использует приложение, а администратор отключает их, делая вызов ajax после того, как он отключен (хотя он все еще входит в систему) должен вывести их из системы. Однако, чтобы сделать это, я хочу вернуть пользовательский ответ, если пользователь делает вызов ajax, и для этого мне нужно ovverride HandleUnauthorizedRequest. Но мой Authorize Core (и по расширению HandleUnauthorizedRequest) игнорируется, если пользователь вошел в систему (несмотря на то, что у меня есть customauthorize теги во всех моих действиях контроллера, которые вызывает ajax).

Вкратце: я хочу авторизовать пользователя по каждому запросу, а не только для запроса на вход (который, похоже, сейчас делает поставщик членства)

4b9b3361

Ответ 1

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

Интересно, что положить точку останова на переопределение HandleUnauthorizedRequest все равно не сломается, но поместить его внутрь метода будет. Странно, и немного отбросил меня, но я решил это сейчас.

Код, если кому-то интересно:

public class CustomAuthorize : AuthorizeAttribute
{
    public string Permissions { get; set; }

    private IAccountRepository AccountRepository { get; set; }        

    private string[] permArray { get; set; }

    private string reqStatus { get; set; }

    public CustomAuthorize()
    {
        this.AccountRepository = new UserModel();
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        base.AuthorizeCore(httpContext);

        if (Permissions != null) {
            permArray = Permissions.Trim().Split(' ');

            if (AccountRepository.isEnabled(httpContext.User.Identity.Name)) {
                this.reqStatus = "permission";
                return AccountRepository.hasPermissions(permArray);                     
            } else {
                return false;
            }
        } else {
            return AccountRepository.isEnabled(httpContext.User.Identity.Name);
        }
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    {
        if (this.reqStatus == "permission") {
            filterContext.Result = new RedirectResult(MvcApplication.eM.cause("no_permission", "redirect"));
        } else {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}

И затем я украсил контроллер следующим:

[CustomAuthorize(Permissions="test_perm")]

Ответ 2

Это может быть глупый ответ/вопрос, но метод AccountRepository.isEnabled возвращает false, чтобы выполнить HandleUnauthorizedRequest?

Если он возвращает true, тогда метод HandleUnauthorizedRequest не будет выполнен.