4

У меня есть сайт ASP.NET Core, который использует проверку файлов cookie для большинства страниц. Для этих страниц желательно, чтобы ответ сервера по умолчанию, предусматривающий перенаправление 302 для неавторизованного клиента, является желательным. Тем не менее, сайт также принимает запросы API; они используют ключи API и не используют файлы cookie.Подавить перенаправление по URL-адресам API в ASP.NET Core

В идеале, я хотел бы отключить обработку файлов cookie для URL-адресов API в целом, но минимально, мне нужно убедиться, что если клиент API неавторизован, сервер не отвечает перенаправлением 302.

ответ

9

Заменить обработчик события redirect тем, который использует поведение по умолчанию, только если путь не является API. В Startup.ConfigureServices, добавьте это:

services.ConfigureApplicationCookie(options => { 
    options.Events.OnRedirectToAccessDenied = ReplaceRedirector(HttpStatusCode.Forbidden, options.Events.OnRedirectToAccessDenied); 
    options.Events.OnRedirectToLogin = ReplaceRedirector(HttpStatusCode.Unauthorized, options.Events.OnRedirectToLogin); 
}); 

Используйте этот вспомогательный метод для замены методов перенаправления:

static Func<RedirectContext<CookieAuthenticationOptions>, Task> ReplaceRedirector(HttpStatusCode statusCode, Func<RedirectContext<CookieAuthenticationOptions>, Task> existingRedirector) => 
    context => { 
     if (context.Request.Path.StartsWithSegments("/api")) { 
      context.Response.StatusCode = (int)statusCode; 
      return Task.CompletedTask; 
     } 
     return existingRedirector(context); 
    }; 

с этим на месте, методы контроллера API можно назвать Unauthorized() и Forbid(), не вызывая редирект.

Обновление: Вышеупомянутое для ASP.NET Core 2. code for ASP.NET Core 1 отличается.

0

Для .net ядра 2.х вот исправление (на основе ответа Эдварда):

services.ConfigureApplicationCookie(options => 
     { 
      options.Events = new CookieAuthenticationEvents 
      { 
       OnRedirectToAccessDenied = ReplaceRedirector(HttpStatusCode.Forbidden, context => options.Events.RedirectToAccessDenied(context)), 
       OnRedirectToLogin = ReplaceRedirector(HttpStatusCode.Unauthorized, context => options.Events.RedirectToLogin(context)) 
      }; 
     }); 

где ReplaceRedirector:

Func<RedirectContext<CookieAuthenticationOptions>, Task> ReplaceRedirector(HttpStatusCode statusCode, Func<RedirectContext<CookieAuthenticationOptions>, Task> existingRedirector) => 
context => 
{ 
    if (context.Request.Path.StartsWithSegments("/api")) 
    { 
     context.Response.StatusCode = (int)statusCode; 
     return Task.CompletedTask; 
    } 
    return existingRedirector(context); 
}; 
+1

Я обновил свой ответ, чтобы включить ASP.NET Сердечник 2. В мое обновление, я не заменил «События», а просто установил его соответствующие свойства. –