我认为你应该使用用户的Claims属性来实现此目的。我找到了一篇好的文章:http://benfoster.io/blog/customising-claims-transformation-in-aspnet-core-identity
User类
public class ApplicationUser : IdentityUser
{
public string MyProperty { get; set; }
}
让我们将MyProperty放入经过身份验证的用户的Claims中。为此,我们要重写UserClaimsPrincipalFactory。
public class MyUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
{
public MyUserClaimsPrincipalFactory (
UserManager<ApplicationUser> userManager,
RoleManager<IdentityRole> roleManager,
IOptions<IdentityOptions> optionsAccessor) : base(userManager, roleManager, optionsAccessor)
{
}
public async override Task<ClaimsPrincipal> CreateAsync(ApplicationUser user)
{
var principal = await base.CreateAsync(user);
((ClaimsIdentity)principal.Identity).AddClaims(new[] {
new Claim(ClaimTypes.Email, user.MyProperty)
});
return principal;
}
}
在Startup.cs中注册我们的UserClaimsPrincipalFactory
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, MyUserClaimsPrincipalFactory>();
}
现在我们可以像这样访问我们的属性。
User.Claims.FirstOrDefault(v => v.Type == ClaimTypes.Email).Value
我们可以创建一个扩展
namespace MyProject.MyExtensions
{
public static class MyUserPrincipalExtension
{
public static string MyProperty(this ClaimsPrincipal user)
{
if (user.Identity.IsAuthenticated)
{
return user.Claims.FirstOrDefault(v => v.Type == ClaimTypes.Email).Value;
}
return "";
}
}
}
我们应该在视图中添加 @Using(我将其添加到全局 _ViewImport.cshtml 中)。
@using MyProject.MyExtensions
最后,我们可以在任何视图中使用此属性作为方法调用
@User.MyProperty()
在这种情况下,您无需向数据库发出额外的查询以获取用户信息。