Мы используем .NET Core 3.1 и Swashbuckle.AspNetCore 5.6.3.
Некоторые из наших действий контроллера требуют отправки User-Identity HTTP-заголовка в запросе. Значение этого HTTP-заголовка User-Identity представляет собой объект JSON в кодировке base64. Пример:
JSON-объект
{
"email": "[email protected]"
}
кодируется в base64 как:
ewogICJFbWFpbCI6ICJ0ZXN0QHRlc3QuY29tIgp9.
Мы реализовали следующую операцию фильтра, которая проверяет, имеет ли действие контроллера атрибут [RequireUserIdentityFilterAttribute], и соответственно добавляет параметр.
public class RequireUserIdentityOperationFilter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
// check if controller action has RequireUserIdentityFilterAttribute with reflection
var hasRequireUserIdentityFilterAttribute = context.MethodInfo
.GetCustomAttributes(true)
.OfType<RequireUserIdentityFilterAttribute>()
.Any();
if (hasRequireUserIdentityFilterAttribute)
{
operation.Parameters.Add(new OpenApiParameter
{
Description = "Base-64 encoded user email object. Example: { \"Email\": \"[email protected]\" } => ewogICJFbWFpbCI6ICJ0ZXN0QHRlc3QuY29tIgp9",
Name = "User-Identity",
In = ParameterLocation.Header,
Schema = new OpenApiSchema
{
Type = "string",
Example = new OpenApiString("ewogICJFbWFpbCI6ICJ0ZXN0QHRlc3QuY29tIgp9")
}
});
}
}
}
Вот как это выглядит в SwaggerUI:

Он отлично работает как есть. User-Identity заголовок отправляется на сервер.
Однако это не очень удобно для пользователя, потому что пользователь должен вводить строку, которая должна быть закодирована в base64. Возможно ли упростить ввод, чтобы пользователю нужно было вводить только адрес электронной почты пользователя (например, [email protected]), а C# обрабатывал кодировку base64 перед отправкой запроса на сервер?





SwaggerUI использует JavaScript для отправки запросов на сервер. Вы можете ввести скрипт, который перехватывает запрос и изменяет заголовок перед его передачей на сервер, например.
app.UseSwaggerUI(c =>
{
// ...
var adjustHeaders = @"(request) => {
let header = request.headers["User-Identity"];
if (header && header.length > 0) {
// header is a JSON object
if (header[0] == "{") header =
btoa(header);
// header is an email address
else if (header.indexOf("@") >= 0)
header = btoa(JSON.stringify({ email: header }));
// Otherwise assume that it is already encoded
request.headers["User-Identity"] = header;
}
return request;
}";
c.UseRequestInterceptor(adjustHeaders);
});
Вышеприведенный скрипт представляет собой псевдо-Javascript, который может дать вам отправную точку. Пожалуйста, проверьте его в браузере, работает ли он в вашей ситуации и для браузеров, на которые нацелен ваш SwaggerUI.
Это кажется правильным подходом, спасибо. Одно маленькое замечание: UseRequestInterceptor недоступен в 5.6.3, пришлось обновить пакет до 6.4.0.
Если вы используете вложение MIME, вам не нужно кодировать. См.: learn.microsoft.com/en-us/previous-versions/office/developer/… вложение MIME находится в теле сообщения и начинается с двух дефисов на новой строке.