Как настроить несколько схем безопасности в ASP.NET Core Swagger с помощью спецификации API NSwagC#

Место общения программистов C#
Ответить
Anonymous
 Как настроить несколько схем безопасности в ASP.NET Core Swagger с помощью спецификации API NSwag

Сообщение Anonymous »

У меня есть веб-API ASP.NET Core 8 со страницей Swagger, использующей Nswag + OpenAPI3. У меня также есть реализация безопасности OAuth2, которая отлично работает. Благодаря украшениям AspNetCoreOperationSecurityScopeProcessor и [AllowAnonymous] пользовательский интерфейс Swagger правильно обрабатывает смешанную (но двоичную) безопасность.
Однако у меня есть несколько «странных» конечных точек, которые возвращают смесь общедоступной и привилегированной информации. Если запрос конкретно запрашивает личную информацию, API выполняет проверку авторизации.
Например, примерно так:

Код: Выделить всё

[AllowAnonymous]
[HttpGet]
public ActionResult GetInfo(bool includePrivateInfo)
{
if (includePrivateInfo)
{
this.authorizationService.RequireLoggedIn();   // throws, resulting in a Forbid();
}

SomeDto result = dataService.GetInfo(includePrivate); //get some data

return result;
}
В клиентском приложении Javascript, которое использует это, я вызываю конечную точку и добавляю токен авторизации к запросу, если пользователь вошел в систему (что-то вроде конструкции «если у вас есть токен, отправьте его»). Если пользователь не вошел в систему, мы все равно вызываем ту же конечную точку. Я не хочу иметь две разные конечные точки в API, одну для аутентификации и одну для анонимности, так как это уменьшает размер клиентского кода.
Проблема в том, что я не могу заставить клиент Swagger дополнительно отправлять токен авторизации, пока AllowAnonymous находится в методе действия.
Вещи, которые я пробовал:
  • Если я добавлю [AllowAnonymous] в метод GetInfo(), тогда Swagger не отправит токен авторизации с запросом к этой конечной точке, даже если я авторизован.
  • Если я добавлю [Authorize] в GetInfo() (и удалю AllowAnonymous), то ASP.NET Core отклонит запрос, если вы не авторизованы в Swagger.
  • Я попробовал добавить беззубый [Authorize(Policy = "Optional")] к методу, а при запуске добавлены options.AddPolicy("Optional", policy => policy.RequireAssertion(context => true));, но ASP.NET Core умнее этого и по-прежнему проверяет, прошел ли пользователь проверку подлинности первым, на каком-то более низком уровне, поэтому для него по-прежнему требуется токен аутентификации.
Я нашел это актуальным вопрос/ответ, который, по-видимому, указывает на то, что то, что я хочу, возможно. Как мне реализовать несколько схем безопасности на конечной точке, используя генерацию спецификаций Swagger/NSwag, где одна анонимна?

Подробнее здесь: https://stackoverflow.com/questions/798 ... h-nswag-ap
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»