[英]MVC 5 - retrieving the ApplicationUser object
我正在開發MVC 5 Internet應用程序,並且對在ApplicationUser
對象中具有自定義對象有疑問。
我在ApplicationUser
對象中有一個public virtual Account account
對象,該對象保存了MVC 5應用ApplicationUser
對象的許多最大計數變量。 當用戶注冊帳戶時,將為每個用戶設置此項。
創建模型對象之前,請檢查用戶是否未超過模型對象的最大數量。 這是在對象的服務類中完成的。
這是用於文件對象的代碼示例:
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
對象時都不必擔心內存/帶寬?
提前致謝。
這是添加具有已登錄身份值的聲明的典型情況。
用戶登錄時,請使用此值添加聲明。 然后,此聲明的值將保留在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()
。
這是非常快速的查找,不會進入您的數據庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.