C# 控制器构造函数中的ASP.NET核心访问用户.Identity
我有一个场景需要访问构造函数控制器中的User.Identity声明 我之所以需要它,是因为声明中包含了启动自定义DB上下文连接字符串所需的信息 我怎样才能访问这个?我只想在DBContext中进行注入,但根据用户的不同,他们可能需要访问不同的数据库 有没有更好的方法来思考这个问题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
[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);
}