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(),

Это очень быстрый поиск, который не попадает в вашу базу данных.

Другие вопросы по тегам