Controller构造函数中的ASP.NET核心访问User.Identity

ahe*_*ick 8 c# entity-framework-core asp.net-core-mvc asp.net-core

我有一个场景,我需要User.Identity在我的构造函数的控制器中访问声明.

我需要这个,因为声明有我需要的信息来启动自定义数据库上下文(连接字符串)

我怎么去访问这个?我只是注入DBContext,但基于用户,他们可能需要访问不同的DB.

有没有更好的方式来考虑这个?

[Authorize]
public class DefaultController : Controller
{
    public DefaultController()
    {
        // this is NULL
        var authenticatedUser = User.Identity.Name;
    }
}
Run Code Online (Sandbox Code Playgroud)

bat*_*ssc 18

HttpContextAccessor提供ASP.NET Core的2.1版本开始.为此,我们必须遵循以下步骤:

使用以下ConfigureServices方法中的标准实现配置服务Startup.cs:

services.AddHttpContextAccessor();
Run Code Online (Sandbox Code Playgroud)

IHttpContextAccessor在控制器上执行依赖注入.使用HttpContext属性进行访问User

[Authorize]
public class DefaultController : Controller
{
    public DefaultController(IHttpContextAccessor contextAccessor)
    {
        // Here HttpContext is not Null :)
        var authenticatedUser = contextAccessor.HttpContext.User.Identity.Name;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 正确但用户仍然为空。 (2认同)

Rab*_*deh 0

 This code I using to get the calims\n\n --------\n\n      int user_id = 0;\n      int Account_id = 0;\n      List<string> roles;\n\n    public TEMP_CON_Controller(DatabaseContext context,IHttpContextAccessor,httpContextAccessor)\n    {\n      _context = context;\n      if (httpContextAccessor.HttpContext.User.Identity.IsAuthenticated)\n      {\n        var user = httpContextAccessor.HttpContext.User;\n\n        this.user_id = int.Parse(user.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value);\n\n        IEnumerable<Claim> claims = user.Claims;\n\n        var accId = claims.Where(x => x.Type == "AccountId").Select(c => c.Value).SingleOrDefault();\n\n        if (!string.IsNullOrEmpty(accId))\n          this.Account_id = Int32.Parse(accId);\n\n        roles = claims.Where(x => x.Type == ClaimTypes.Role).Select(c => c.Value).ToList();\n\n\n      }\n    }\n\xe2\x80\x8b\n
Run Code Online (Sandbox Code Playgroud)\n