#asp.net-core #asp.net-identity
#asp.net-ядро #asp.net-идентификация
Вопрос:
Я расширил IdentityUser
класс и добавил свойство, которое ссылается на школьную таблицу, выглядящую следующим образом:
public class ApplicationUser : IdentityUser
{
public Guid? SchoolId { get; set; }
public School School { get; set; }
}
Теперь во всех контроллерах моего приложения мне нужно проверить, есть ли у вошедшего в систему пользователя какие-либо школы, связанные с его регистрацией. В противном случае доступ должен быть запрещен. У меня уже есть [Authorize(Roles = "admin, coordinator, librarian")]
для проверки доступа, но эта проверка основана на ролях. Теперь мне нужно, чтобы в дополнение к ролям можно было проверить SchoolId
свойство.
Как мне выполнить эту проверку? Я не хотел выполнять ручную проверку каждого из них Action
.
Комментарии:
1. оцените аутентификацию на основе утверждения, learn.microsoft.com/en-us/aspnet/core/security/authorization /…
Ответ №1:
Вы можете определить, HasSchoolPolicy
который основан на утверждении HasSchool
:
services.AddAuthorization(options =>
{
options.AddPolicy("SchoolPolicy", policy =>
policy.RequireClaim("HasSchool"));
});
И на уровне IDP каждый пользователь должен обновлять свое утверждение на основе SchoolId
свойства с:
if (user.SchoolId.HasValue)
await userMgr.AddClaimAsync(user, new Claim("HasSchool"))
И затем вы просто добавляете обозначение к методу контроллера с:
[Authorize(Policy = "SchoolPolicy", Roles = "...")]