Без указания ASP. NET Ядро для этого не будет использовать настроенную политику для авторизации чего-либо. Политики авторизации позволяют заранее задавать сложные условия авторизации, чтобы вы могли использовать это поведение в случае необходимости. Однако он не применяется по умолчанию и не может учитывать, что вы уже настроили две политики: какие из них должны применяться? Все они? Тогда зачем настраивать отдельные политики?
Таким образом, вместо этого никакая политика не используется для авторизации пользователя, если вы явно не сообщите об этом инфраструктуре. Одним из распространенных методов является использование атрибута [Authorize]
с именем политики. Вы можете указать это для действий контроллера, а также для самих контроллеров, чтобы все его действия были авторизованы с помощью этой политики:
[Authorize("Roles")] // ← this is the policy name
public class ExampleController : Controller
{
// …
}
Если у вас есть политика, которую вы хотите использовать большую часть времени для авторизации пользователей, вы можете настроить эту политику по умолчанию:
services.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
}
Например, это определит политику, которая требует аутентифицированных пользователей по умолчанию. Таким образом, всякий раз, когда вы используете атрибут [Authorize]
без указания явной политики, он будет использовать эту политику по умолчанию.
Все это все равно потребует от вас пометить Маршруты как-то, что вам требуется авторизация. Помимо использования атрибута [Authorize]
, вы также можете сделать это в более центральном месте: вызов app.UseEndpoints()
в вашем классе Startup
.
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}")
.RequireAuthorization("Roles");
Это шаблон маршрута по умолчанию для контроллеров, но с вызов RequireAuthorization
, для которого в основном потребуется политика авторизации Roles
на всех маршрутах, соответствующих этому шаблону маршрута.
Вы также можете использовать это место для настройки различных политик авторизации по умолчанию для различных маршрутов: Разделив ваш шаблон маршрута, вы можете сделать несколько вызовов на MapControllerRoute
с различными шаблонами маршрутов, которые все задают свою собственную политику авторизации.
Я думал, что вместо того, чтобы украшать каждый контроллер или действие, Я скорее хотел иметь некоторую карту предварительной конфигурации в БД, а затем в конвейере проверять роль или роли пользователей, которые выделяются при аутентификации пользователя. Когда пользователь затем пытается получить доступ к URL-адресу, роль пользователя проверяется, и доступ предоставляется или отклоняется.
Вы можете переместить логи c, насколько точно пользователь авторизован в обработчике авторизации, который проверяет ваши требования. Вы все равно включили бы политику, которая имеет это требование, для всех маршрутов, которые вы хотите протестировать.
Однако я бы вообще советовал не делать этого: требования авторизации должны быть простыми, и вы, как правило, хотите быть в состоянии проверить их без попадания в базу данных или что-то другое внешний ресурс. Вы хотите напрямую использовать утверждения пользователя, чтобы быстро принять решение, имеет ли пользователь право доступа к чему-либо. В конце концов, эти проверки выполняются при каждом запросе, поэтому вы хотите сделать это быстро. Одним из основных преимуществ авторизации на основе утверждений является то, что вам не нужно обращаться к базе данных при каждом запросе, поэтому вы должны сохранить это преимущество, убедившись, что все, что нужно для авторизации пользователя, доступно в их утверждениях.