获取当前主体作为 ASP.Net 核心标识中的自定义应用程序用户



在以前版本的 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 的启动配置是通过依赖注入完成的。

相关内容

  • 没有找到相关文章

最新更新