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).
Вкратце: я хочу авторизовать пользователя по каждому запросу, а не только для запроса на вход (который, похоже, сейчас делает поставщик членства)
Ответы
Ответ 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 не будет выполнен.