EF Core 2.0.1中如何在BaseController访问ApplicationUser自定义属性
在.NET Core中从BaseController访问ApplicationUser的DisplayUsername属性
嗨,我来帮你解决这个问题。在.NET Core里,我们不能再像.NET Framework那样依赖Thread.CurrentPrincipal了,不过有更优雅的方式来访问自定义用户属性。下面分两种常用场景给你说明:
方法1:从Claims中快速获取(推荐用于非实时场景)
如果你的DisplayUsername不需要实时从数据库拉取,而是可以使用登录时缓存的数据,那直接从Controller自带的User属性(ClaimsPrincipal类型)里读取是最高效的。
首先你需要确保登录时把DisplayUsername添加到用户的Claims中,可以通过自定义UserClaimsPrincipalFactory来实现:
public class CustomUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser> { public CustomUserClaimsPrincipalFactory(UserManager<ApplicationUser> userManager, IOptions<IdentityOptions> optionsAccessor) : base(userManager, optionsAccessor) { } protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user) { var identity = await base.GenerateClaimsAsync(user); // 添加DisplayUsername到Claims identity.AddClaim(new Claim("DisplayUsername", user.DisplayUsername ?? string.Empty)); return identity; } }
然后在Startup.cs的ConfigureServices里注册这个工厂:
services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, CustomUserClaimsPrincipalFactory>();
接下来在你的BaseController里就可以直接读取了:
public class BaseController : Controller { // 封装成属性方便子控制器使用 protected string DisplayUsername => User.FindFirstValue("DisplayUsername"); }
方法2:从数据库获取最新数据(适合需要实时更新的场景)
如果DisplayUsername可能被后台修改,你需要拿到最新的值,那可以注入UserManager<ApplicationUser>到BaseController中,直接从数据库查询:
public class BaseController : Controller { private readonly UserManager<ApplicationUser> _userManager; public BaseController(UserManager<ApplicationUser> userManager) { _userManager = userManager; } // 因为UserManager的方法是异步的,所以封装成异步方法 protected async Task<string> GetLatestDisplayUsernameAsync() { var currentUser = await _userManager.GetUserAsync(User); return currentUser?.DisplayUsername ?? string.Empty; } }
注意这种方式会产生数据库查询,所以如果不是必须实时获取,优先用方法1。
补充说明
- .NET Core中Controller的
User属性已经封装了当前登录用户的ClaimsPrincipal,不需要再手动从线程上下文获取,这是框架提供的更安全、更符合依赖注入理念的方式。 - 如果你的
DisplayUsername是必填项,可以在AddClaim的时候做非空判断,避免空引用问题。
内容的提问来源于stack exchange,提问作者J86
相关产品推荐
相关产品推荐

