首先,如果不每次都访问数据库(至少是推荐的方式),就无法做到这一点,因为您获取的用户数据和权限可能会发生变化。
其次,您可以在布局中使用@inject 并通过ClaimsPrincipal User 获取用户数据,这样您就可以这样做:
@inject UserManager<TheUser> userManager.
然后你可以这样做:var user=await userManager.FindByNameAsync(User.Identity.Name) 现在你用用户数据填充你的标签。
类似这样的:
_Layout.cshtml
@inject UserManager<TheUser> userManager
@{
var user=await userManager.FindByNameAsync(User.Identity.Name)
}
<div>
@user.FullName
</div>
另一种方法是创建自定义“声明原则”工厂。是这样的:
public class MyUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser>
{
public MyUserClaimsPrincipalFactory(
UserManager<ApplicationUser> userManager,
IOptions<IdentityOptions> optionsAccessor)
: base(userManager, optionsAccessor)
{
}
protected override async Task<ClaimsIdentity>GenerateClaimsAsync(ApplicationUser user)
{
var identity = await base.GenerateClaimsAsync(user);
identity.AddClaim(new Claim("FullName", user.FullName));
return identity;
}
}
然后你把它添加到你的ConfigureServices:
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddClaimsPrincipalFactory<MyUserClaimsPrincipalFactory>();
现在你可以像这样访问它
User.FindFirst("FullName").Value
ClaimsPrincipal User 也有一个 User.IsInRole 来检查用户角色。
假设您的菜单是数据驱动的,并且菜单存在于 _Layout 页面中。你是怎么做到的?
通常只针对数据,您可以将其缓存在服务器内存中,这样您就可以最大限度地减少数据库请求的数量(当“数据”被修改并重新缓存时清除缓存)但我建议不要这样做,因为您处理用户数据。