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

时间:2017-05-24 08:13:36

标签: asp.net asp.net-mvc asp.net-identity claims-based-identity

在以前的ASP.NET版本中,如果我想将自定义类作为当前登录用户,我所做的是:我让FormsAuthentication模块完成其工作,然后在PostAuthenticateRequest事件中我替换了当前的Principal(HttpContext.Current.User)和我从数据库中获取的自定义主体对象(带有一些性能缓存)。

如何在ASP.NET身份中实现相同的功能?我有自己的ApplicationUser(不是EntityFramework ASP.NET Identity附带的默认值)和我自己的UserStore。

在每个经过身份验证的请求中,我将HttpContext.User作为ClaimsPrincipal对象。有没有办法用我的CustomClaimsPrincipal替换它?

还有另一种更好的方法是根据当前的ClaimsPrincipal检索当前的ApplicationUser实例吗?

1 个答案:

答案 0 :(得分:2)

如果您拥有自己的IUserStore,则可以实施IUserClaimStore来自定义传递给声明主体的声明标识。

如果您需要替换默认声明主体,则应实施IUserClaimsPrincipalFactory并将实施传递给SignInManager并将配置的管理器注册到您的owin上下文。

它应该看起来像这样。 (假设您正在使用 ASP.NET核心标识,对于Identity 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 Core ,类似OWIN的启动配置是通过dependency injection完成的。