Производный ClaimsAuthorizationManager.CheckAccess возвращает значение False в веб-API ASP.net MVC

Источники сообщают, что если дочерний класс ClaimsAuthorizationManager CheckAccess возвращает false, по замыслу фреймворка он выдает исключение безопасности.

Кажется, нет способа поймать эту ошибку, если я хочу украсить функцию ApiController (например) [ClaimsPrincipalPermission(SecurityAction.Demand, Operation="Read", Resource="Something")].

Я уже создал образец AuthorizationManager, производный от ClaimsAuthorizationManager, и зарегистрировал его в web.config. Эта часть конфигурации работает.

public class AuthorizationManager : ClaimsAuthorizationManager
{
     public override bool CheckAccess(AuthorizationContext context)
     {
          return false; // just to show that it will throw the security exception
     }     
}

Итак, я настроил авторизацию на сбой, несмотря ни на что, но я хочу вернуть пользователю ответ 401 вместо этого «инвазивного» 500 (исключение безопасности возвращается как внутренняя ошибка сервера).

Кажется, ни у кого нет ответа на этот вопрос, и, похоже, мы просто остановимся на 500, чтобы сообщать клиентам о несанкционированном доступе.


person Mickael Caruso    schedule 28.08.2013    source источник
comment
Вы нашли лучшее решение? Кажется неправильным возвращать 500, когда очевидно, что это должно быть 401. Думая, что мне было бы лучше реализовать собственный AuthenticationFilter, потому что я могу легко вернуть 401 из одного из них.   -  person Farinha    schedule 21.04.2015


Ответы (1)


Это только идея, но я считаю, что вы также можете установить флаг в контейнере Items, а затем в Application_EndRequest вы можете проверить, выполняются ли эти два условия:

  • код состояния ответа 500
  • флаг установлен

В таком случае вы можете просто изменить код состояния на 401.

person Wiktor Zychla    schedule 28.08.2013