如何从登录的用户检索其他信息,而无需每次都访问数据库

时间:2018-07-15 17:09:20

标签: asp.net-core asp.net-identity

我正在使用ASP.NET Core 2.0和Identity Framework。我的应用程序有多个订阅。今天,订阅ID已存储在ApplicationUser对象上,并保留在数据库上下文中。

每个Web呼叫我都在查看数据库,以获取已登录用户的subscriptionId属性。

如何避免已登录用户的数据库调用?

1 个答案:

答案 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