在以前版本的 ASP.NET 中,如果我想有一个自定义类作为我当前的登录用户,我所做的是:我让FormsAuthentication模块完成它的工作,然后在PostAuthenticateRequest事件中,我将当前的主体(HttpContext.Current.User(替换为我从数据库中获取的自定义主体对象(为了提高性能而进行了一些缓存(。
如何在 ASP.NET 身份中实现相同的目标?我有自己的 ApplicationUser(不是 EntityFramework ASP.NET Identity 附带的默认应用程序(和我自己的 UserStore。
在每个经过身份验证的请求中,我都有 HttpContext.User 作为 ClaimsPrincipal 对象。有没有办法用我的CustomClaimsPrincipal替换它?
是否有另一种更好的方法,基于当前的 ClaimPrincipal 检索当前的 ApplicationUser 实例?
如果您有自己的IUserStore
则可以实现IUserClaimStore
来自定义传递给声明主体的声明标识。
如果需要替换默认声明主体,则应实现IUserClaimsPrincipalFactory
并将实现传递给SignInManager
并将配置的管理器注册到 owin 上下文。
它应该看起来像这样。(假设您使用的是 ASP.NET 核心标识,对于标识 v2,接口和构造函数可能会有所不同!
class CustomClaimsFactory<TUser> : Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<TUser>
where TUser : class
{
public Task<ClaimsPrincipal> CreateAsync(TUser user)
{
// create and return your custom principal
}
}
class OwinStartup
{
public void Configuration(IAppBuilder app)
{
app.CreatePerOwinContext(CreateSignInManager);
}
Microsoft.AspNetCore.Identity.SignInManager CreateSignInManager()
{
UserManager manager; // the manager that uses your custom IUserStore
IHttpContextAccessor accessor; // I don't know where to get it from...
var factory = new CustomClaimsFactory();
return new SignInManager(manager, accessor, factory, null, null, null);
}
}
对于 ASP.Net 核心,类似 OWIN 的启动配置是通过依赖注入完成的。