Почему «UseAuthentication» нужно размещать после «UseRouting», а не раньше? - PullRequest
0 голосов
/ 20 октября 2019

Согласно документации порядок промежуточного программного обеспечения должен быть следующим:

app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();

У меня есть промежуточное программное обеспечение для защиты статических файлов, основанное на этой статье (защита определенных маршрутов). Проблема, с которой я сталкиваюсь, состоит в том, что заказ не работает для меня. Я могу защитить папку, только если пользователь уже авторизован. Поэтому мне нужно поместить UseProtectFolder до UseStaticFiles и после UseAuthentication и UseAuthorization:

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.UseProtectFolder(new ProtectFolderOptions
{
    Path = "/Secret",
    PolicyName = "Authenticated"
});
app.UseStaticFiles();

Но это не вернет статический файл. Похоже, UseRouting делает что-то, что делает файл недоступным, возвращает 404, потому что, когда я изменяю порядок на это, перемещается UseRouting после UseStaticFiles, это работает:

app.UseAuthentication();
app.UseAuthorization();

app.UseProtectFolder(new ProtectFolderOptions
{
    Path = "/Secret",
    PolicyName = "Authenticated"
});
app.UseStaticFiles();

app.UseRouting();

Так чтофактическое изменение порядка состоит в том, что UseAuthentication ставится перед UseRouting (и даже до UseStaticFiles).

Из документации:

Порядок добавления компонентов промежуточного программного обеспеченияв методе Startup.Configure определяет порядок, в котором компоненты промежуточного программного обеспечения вызываются на запросы, и обратный порядок ответов. Порядок имеет решающее значение для безопасности, производительности и функциональности .

Мой вопрос сейчас: в порядке, задокументированном, почему UseAuthentication ставится после UseRouting?

Есть ли какая-то конкретная причина или это только для производительности? И, перемещая аутентификацию / авторизацию ранее в конвейере, это влияет на ответ (обратный порядок)?

1 Ответ

0 голосов
/ 27 октября 2019

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

Прочитав комментарий Дэвида Фаулера:

UseAuthorization () ->Посмотрите на заполненного пользователя и текущую конечную точку, чтобы определить, нужно ли применять политику авторизации.

мне пришло в голову, что с UseAuthorization нет проблем. Он предназначен для конечных точек, поэтому он мне не нужен для защиты папок. Это также объясняет, почему этот оператор имеет смысл только после оператора UseEndpoints.

Для полной картины моей конфигурации у меня есть один поставщик политик (включая политики), один переписчик URL-адресов (например, UseDefaultFiles) и промежуточное ПО, которое защищает определенныепапки.

Мой вывод заключается в том, что я могу использовать следующий порядок, который почти совпадает с задокументированным:

// Identify the user. The only statement that is not in the order as documented
app.UseAuthentication();

// Middleware that adds policies
app.UsePolicyProvider();
// Protect the folder by policy
app.UseProtectFolder(new ProtectFolderOptions { Path = "/p", PolicyName = "admin" });
// URL rewriter for serving tenant specific files
app.UseTenantStaticFiles();

// Serve the static files
app.UseStaticFiles();

app.UseCookiePolicy();
app.UseCors();

app.UseRouting();
app.UseRequestLocalization();
app.UseAuthorization();
app.UseEndpoints();

Два замечания о порядке:

  1. UseRequestLocalization работает только после UseRouting
  2. UseStaticFiles не работает после UseRouting, когда задействована перезапись URL, например UseDefaultFiles.
...