MVC 5 - получение объекта ApplicationUser
Я занимаюсь разработкой интернет-приложения MVC 5 и у меня есть вопрос относительно наличия в ApplicationUser
объект.
у меня есть public virtual Account account
объект в ApplicationUser
объект, который содержит много переменных максимального количества объектов в моем приложении MVC 5. Это устанавливается для каждого пользователя, когда пользователь регистрирует учетную запись.
Прежде чем создавать объект модели, я проверяю, не превысил ли пользователь максимальное значение для объекта модели. Это делается в классе обслуживания для объекта.
Вот пример кода, используемого для файлового объекта:
var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
ApplicationUser user = userManager.FindByNameAsync(userName).Result;
int maxFiles = user.account.maxFiles;
Я использую много классов обслуживания для многих объектов с похожим кодом, чтобы получить ApplicationUser
объект.
Мой вопрос заключается в следующем: вместо того, чтобы получить ApplicationUser
каждый раз, для каждого класса обслуживания, возможно ли сохранить этот объект при входе пользователя в систему, а затем обратиться к этому объекту до создания модельного объекта? Если да, где я могу хранить этот объект для вышеуказанной цели?
Кроме того, сколько памяти / пропускной способности используется при извлечении ApplicationUser
объект? Используется ли минимальная память / пропускная способность, так что мне не нужно беспокоиться о памяти / пропускной способности при получении ApplicationUser
объект каждый раз, прежде чем я создаю модельный объект?
Заранее спасибо.
1 ответ
Это типичный случай для добавления заявки со значением вошедшего в систему удостоверения.
Когда пользователь входит в систему, вы добавляете претензию с этим значением. Значение этого требования затем сохраняется в файле cookie. И доступен каждый раз, когда пользователь возвращается, и это очень быстрый поиск, который происходит в любом случае для проверки подлинности cookie.
Чтобы добавить это утверждение к личности, необходимо переопределить CreateIdentityAsync
метод на ApplicationUserManager
:
public override async Task<ClaimsIdentity> CreateIdentityAsync(ApplicationUser user, string authenticationType)
{
var identity = await base.CreateIdentityAsync(user, authenticationType);
identity.AddClaim(new Claim("MyApplication:maxFiles", user.account.maxFiles));
return identity;
}
Затем для доступа к этому вы можете создать метод расширения:
public static int GetMaxFiles(this IPrincipal principal)
{
if (principal == null)
{
throw new ArgumentNullException("principal");
}
var claimsPrincipal = principal as ClaimsPrincipal;
if (claimsPrincipal == null)
{
throw new DomainException("User is not authenticated or IPrincipal is not ClaimsPrincipal");
}
var claim = claimsPrincipal.Claims.FirstOrDefault(c => c.Type == "MyApplication:maxFiles");
int maxfiles = 0;
if(int.TryParse(claim.Value, out maxfiles))
{
return maxfiles;
}
throw new Exception("Claim value is not an integer")
}
И в вашем приложении вы можете использовать его как var maxFiles = HttpContext.Current.User.GetMaxFiles()
, Или, если это контроллер или представление, то вы можете сделать var maxFiles = User.GetMaxFiles()
,
Это очень быстрый поиск, который не попадает в вашу базу данных.