我认为您应该为此目的使用用户的 Claims 属性。我找到了关于:http ://benfoster.io/blog/customising-claims-transformation-in-aspnet-core-identity 的好帖子
用户类
public class ApplicationUser : IdentityUser
{
public string MyProperty { get; set; }
}
让我们将 MyProperty 放入已验证用户的声明中。为此,我们将覆盖 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);
//Putting our Property to Claims
//I'm using ClaimType.Email, but you may use any other or your own
((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 添加到 View(我将它添加到全局 _ViewImport.cshtml)
@using MyProject.MyExtensions
最后我们可以在任何视图中使用这个属性作为方法调用
@User.MyProperty()
在这种情况下,您无需对数据库进行额外查询以获取用户信息。