Авторизация на основе свойств класса IdentityUser

#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 = "...")]