C# 控制器构造函数中的ASP.NET核心访问用户.Identity

C# 控制器构造函数中的ASP.NET核心访问用户.Identity,c#,asp.net-core,asp.net-core-mvc,entity-framework-core,C#,Asp.net Core,Asp.net Core Mvc,Entity Framework Core,我有一个场景需要访问构造函数控制器中的User.Identity声明 我之所以需要它,是因为声明中包含了启动自定义DB上下文连接字符串所需的信息 我怎样才能访问这个?我只想在DBContext中进行注入,但根据用户的不同,他们可能需要访问不同的数据库 有没有更好的方法来思考这个问题 [Authorize] public class DefaultController : Controller { public DefaultController() { // th

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

我之所以需要它,是因为声明中包含了启动自定义DB上下文连接字符串所需的信息

我怎样才能访问这个?我只想在DBContext中进行注入,但根据用户的不同,他们可能需要访问不同的数据库

有没有更好的方法来思考这个问题

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

要访问.NETCore中的User.Identity声明,您需要使用HttpContext。下面是我的实现

第一寄存器

services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
然后在服务或控制器类中注册

private readonly IHttpContextAccessor _httpContextAccessor;

public UserService(
            IHttpContextAccessor httpContextAccessor,
            IUnitOfWork unitOfWork,
            UserManager<User> userManager,
            SignInManager<User> signInManager,
            RoleManager<ApplicationRole> roleManager)
        {
            _httpContextAccessor = httpContextAccessor;
            _unitOfWork = unitOfWork;
            _userManager = userManager;
            _signInManager = signInManager;
            _roleManager = roleManager;
            _currentUserGuid = _httpContextAccessor?.HttpContext?.User?.FindFirst(UserClaimsKey.Sub)?.Value;
            _currentUserName = _httpContextAccessor?.HttpContext?.User?.Identity?.Name;
            _currentUserEmail = _currentUserGuid == null ? "" : userManager.FindByIdAsync(_currentUserGuid)?.Result?.Email;
        }
可以找到实现的详细信息


从ASP.NET Core的2.1版开始,如果您有任何问题,请告诉我,提供了HttpContextAccessor。为此,我们必须遵循以下步骤:

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

在控制器上执行IHttpContextAccessor的依赖项注入。使用HttpContext属性访问用户


以上链接来自Rabea AlTaradeh:

    Startup.cs
     //services section
     services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

[Authorize]
public class HomeController : Controller
{
  #region DI         
  private string UserEmail;
  private readonly IHttpContextAccessor _httpContextAccessor;
  public HomeController(IHttpContextAccessor httpContextAccessor)
  {
    _httpContextAccessor = httpContextAccessor;
    UserEmail = _httpContextAccessor.HttpContext.User.Claims
                .FirstOrDefault(c => c.Type == "preferred_username")?.Value;

  }
  #endregion DI 
   public IActionResult Index()
   {            
      ViewBag.UserEmail = UserEmail;   
      return View();
   }
}

在Asp.net Core v.2+中,您不必注入HttpContext或其他内容。按如下方式访问用户:

public IActionResult GetMe()
{
    return Ok(User.Identity.Name);
}

向我们展示一个需要它的类的示例代码。我只需要访问控制器构造函数中的User.Identity。您应该向我们展示您所做的尝试,然后我们修改那里的示例,以帮助您了解如何访问您要查找的数据。在控制器构造函数中访问用户将始终为null。你对此无能为力。尝试使用ActionFilter。我看到httpContextAccessor.HttpContext.User为Null可能是您的startup.cs配置未完成查看此链接以检测配置:您说您可以在控制器构造函数中访问用户?似乎与其他人的说法相矛盾无论是在控制器中还是在任何C文件中。。。您应该在if语句中生成代码,以获取我在ProjectsRect中使用的此代码的用户信息,但用户仍然为空。您必须检查启动时的配置是否正确,这对meI有效,但我的IIS配置不正确,执行此操作修复了此问题。您可以打开IIS和:1-激活Windows自动验证;2-禁用匿名自动验证。从我使用asp net core 2.2开始,这将在控制器方法中工作,因为已经定义了用户。问题是如何访问构造函数中的用户成员,除非您使用HttpContextAccessor,否则该成员不可用,如batressc的帖子所示。
[Authorize]
public class DefaultController : Controller
{
    public DefaultController(IHttpContextAccessor contextAccessor)
    {
        // Here HttpContext is not Null :)
        var authenticatedUser = contextAccessor.HttpContext.User.Identity.Name;
    }
}
    Startup.cs
     //services section
     services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

[Authorize]
public class HomeController : Controller
{
  #region DI         
  private string UserEmail;
  private readonly IHttpContextAccessor _httpContextAccessor;
  public HomeController(IHttpContextAccessor httpContextAccessor)
  {
    _httpContextAccessor = httpContextAccessor;
    UserEmail = _httpContextAccessor.HttpContext.User.Claims
                .FirstOrDefault(c => c.Type == "preferred_username")?.Value;

  }
  #endregion DI 
   public IActionResult Index()
   {            
      ViewBag.UserEmail = UserEmail;   
      return View();
   }
}
public IActionResult GetMe()
{
    return Ok(User.Identity.Name);
}