我正在使用ASP.NET Core 2.0和Identity Framework。我的应用程序有多个订阅。今天,订阅ID已存储在ApplicationUser
对象上,并保留在数据库上下文中。
每个Web呼叫我都在查看数据库,以获取已登录用户的subscriptionId
属性。
如何避免已登录用户的数据库调用?
答案 0 :(得分:3)
正如@Kirk在评论中所说,您可以为此使用声明。
您需要在用户登录时将subscriptionId
添加到ClaimsIdentity
并在控制器中检索值。
我假设您在subscriptionId
中拥有一个ApplicationUser
属性
public class ApplicationUser : IdentityUser
{
public int SubscriptionId { get; set; }
}
要添加自定义声明,您需要实现IUserClaimsPrincipalFactory
public class CustomUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser>
{
public CustomUserClaimsPrincipalFactory(UserManager<ApplicationUser> userManager, IOptions<IdentityOptions> optionsAccessor)
: base(userManager, optionsAccessor)
{
}
protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user)
{
ClaimsIdentity claimsIdentity = await base.GenerateClaimsAsync(user);
claimsIdentity.AddClaim(new Claim("subscription_id", user.SubscriptionId));
return claimsIdentity;
}
}
user.SubscriptionId
必须是字符串。在其他情况下,您可以创建属性以将该值转换为字符串。
public string SubscriptionIdStting => SubscriptionId.ToString();
将其注册到IServiceCollection
services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, CustomUserClaimsPrincipalFactory>();
您可以像这样在Controller或Page中访问SubscriptionId
:
User.FindFirst("subscription_id").Value