Использование токенов-носителей и аутентификация файлов cookie вместе

У меня есть одностраничное приложение - более или менее на основе шаблона SPA MVC5 - с помощью токенов-носителей для аутентификации.

На сайте также есть несколько обычных страниц MVC, которые необходимо защитить, но используя аутентификацию cookie.

В Startup.Auth я могу включить оба типа авторизации:

app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOAuthBearerTokens(OAuthOptions);

Однако это похоже на побочный эффект в том, что всякий раз, когда запрос AJAX отправляется из SPA, он отправляет токен-носитель в заголовок и cookie.

В то время как поведение, которое я действительно хочу, состоит в том, что только токен-носитель используется для вызовов WebAPI и только cookie для вызовов MVC.

Мне также нравятся вызовы MVC для перенаправления на страницу входа в систему, если они не авторизованы (установлены как CookieAuthenticationOption), но, очевидно, я не хочу, чтобы это происходило при вызове API.

Есть ли какой-нибудь способ аутентификации смешанного режима в одном приложении? Возможно, через фильтр пути/маршрута?

Ответ 1

Думаю, я справился с этим: -

Startup.Auth подключает конвейер OWIN, поэтому есть право включать в него Cookies и токены. Но одно изменение параметров cookie указывает тип аутентификации, к которому он должен относиться:

CookieOptions = new CookieAuthenticationOptions
{
  AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie   
};

Затем мне нужно было настроить WebAPI только для использования токенов:

public static void Configure(HttpConfiguration config)
{
   // Configure Web API to use only bearer token authentication.
   config.SuppressDefaultHostAuthentication();
   config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
}

Это, кажется, достигает того, чего я хочу. WebAPI использует только токены-носители и файлы cookie, а некоторые обычные страницы MVC используют файлы cookie после входа в систему (используя AuthenticationManager).