Обрабатывать код несанкционированного запроса и возврата 404 - PullRequest
0 голосов
/ 24 января 2019

Я разрабатываю автономную структуру таргетинга API .Net Core .Net Core 2.2.
Схема аутентификации - это подключение JWTBearerTokens к нашему серверу идентификации ADFS.
Когда я вызываю конечную точку API, украшенную атрибутом [Authorize]Я получаю 401 Несанкционированный ответ, который является ожидаемым и поведение по умолчанию.

Что я хочу сделать дальше, вместо того, чтобы тот же самый вызов возвращал 401, я хотел бы вернуть код состояния равным 404.(Я не хочу вдаваться в подробности того, почему 404. Просто я не хочу раскрывать, что конечная точка существует, если в запрос не включен действительный токен)

В предыдущем .Net Framework WebAPI выможет создать свой собственный атрибут и переопределить метод HandleUnauthorizedRequest и вернуть нужный код состояния.

Я просмотрел документацию по авторизации на основе политик, но не пробовал образец или пытался реализовать его.Обработчик политики выглядит более связанным с обработкой (возвращение успеха или неудачи), если политика не выполняется.Я не вижу нигде, где вы можете вернуть другой код состояния в случае сбоя.Так что это будет иметь смысл, только если я начну проверять фактические Политики.

Есть идеи?

1 Ответ

0 голосов
/ 25 января 2019

Возвращать 404 вместо 401 - плохая практика (как упомянуто в комментариях @Chris Pratt), и ее следует избегать. Рассмотрим эти случаи,

  1. Вы оставляете проект кому-то другому, и они не могут понять, почему возвращается 404
  2. 404 возвращается, когда вы вызываете домашнюю страницу / страницу указателя. Плохая идеология.
  3. Позже в проекте вы разрешаете публиковать запросы без аутентификации. И так далее, и тому подобное.

В любом случае, как часть сообщества, я дам вам ответ ...

Добавьте это в ваш global.asax

void Application_EndRequest(object source, System.EventArgs args)
{
    if (Response.StatusCode == 401)
    {
        Response.ClearContent();
        Response.RedirectToRoute("ErrorH", (RouteTable.Routes["ErrorH"] as Route).Defaults);
    }
}

И в routeConfig создайте маршрут для вашей ошибкиHandler:

routes.MapRoute(
    "ErrorH",
    "Error/{action}/{errMsg}",
    new { controller = "CustomController", action = "Change401To404", errMsg = UrlParameter.Optional }
);

А в вашем кастомном контроллере:

public class CustomController : Controller //or Base
{
    public ActionResult Change401To404(){
         //Do whatever you want
    }
}

PS: Это не единственный способ, есть много других способов сделать это. Но по крайней мере в этом методе вы можете отличить реальные 404 ответа от 401 ответа.

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