#c# #asp.net #.net #asp.net-core #razor-pages
Вопрос:
Я пытаюсь реализовать ролевую авторизацию в своем приложении Razor Pages.
Вот что у меня есть на данный момент.
// Create authorization policies
services.AddAuthorization(options =>
{
options.AddPolicy("Staff", p => p.RequireRole(Role.Staff));
options.AddPolicy("Admin", p => p.RequireRole(Role.Admin));
});
// Set authorization
services.AddRazorPages(options =>
{
options.Conventions.AuthorizeFolder("/", Role.Staff);
options.Conventions.AuthorizeAreaFolder("/", "/", Role.Staff);
options.Conventions.AuthorizeAreaFolder("Admin", "/", Role.Admin);
options.Conventions.AuthorizeAreaFolder("Leasing", "/", Role.Staff);
options.Conventions.AuthorizeAreaFolder("Repair", "/", Role.Staff);
options.Conventions.AuthorizeAreaFolder("Storage", "/", Role.Staff);
options.Conventions.AuthorizeAreaFolder("Transloading", "/", Role.Staff);
options.Conventions.AllowAnonymousToPage("/Index");
options.Conventions.AllowAnonymousToPage("/Error");
});
Кажется, это работает. Проблема заключается в том, чтобы явно указать каждую из папок «Моя область». Что произойдет, если будет добавлена новая область, но они забудут добавить ее сюда? Это небезопасный подход.
Примечание: Я не уверен, что options.Conventions.AuthorizeAreaFolder("/", "/", Role.Staff)
делает, но довольно ясно, что он не устанавливает авторизацию для всех областей, как я хочу.
Как я могу задать политику для каждой области (включая области, добавленные в будущем) в «Персонал», за исключением области администратора, в которой должна быть политика «Администратор»?
Примечание: Я использую последнюю версию .NET 5.
Комментарии:
1. Я полностью понимаю ваш вопрос, но политики не могут применяться на уровне обработчика страницы Razor, они должны применяться к Странице. Политики могут быть применены к страницам Razor с помощью соглашения об авторизации . И мы можем использовать только метод AuthorizeAreaFolder (), чтобы установить авторизацию для каждой области. Я не нашел более простого способа установить авторизацию для всех областей сразу. Я предлагаю вам отправить отзыв в dotnet/aspnetcore .