C# 将带有HttpContext.Session的用户ID传递给其他控制器
我已经搜索过类似的问题,但是由于一些语法发生了变化,我还没有找到我正在寻找的答案 我试图从Login/HomeController传递一个UserID,这样应用程序的所有控制器/视图都可以访问它。登录目前是硬编码的,因为我现在只是想传递一个值C# 将带有HttpContext.Session的用户ID传递给其他控制器,c#,asp.net-core,model-view-controller,C#,Asp.net Core,Model View Controller,我已经搜索过类似的问题,但是由于一些语法发生了变化,我还没有找到我正在寻找的答案 我试图从Login/HomeController传递一个UserID,这样应用程序的所有控制器/视图都可以访问它。登录目前是硬编码的,因为我现在只是想传递一个值 Session[“key”]不起作用,HttpContext.Current也不起作用,它在最新的MVC版本中甚至不存在。 在HomeController本身中,我可以使用HttpContext.Session.SetString(Key,“string”
Session[“key”]
不起作用,HttpContext.Current也不起作用,它在最新的MVC版本中甚至不存在。
在HomeController本身中,我可以使用HttpContext.Session.SetString(Key,“string”)
但我不知道如何在其他控制器/视图中访问它
我已经找到了IHttpContextAccessor
,但由于我必须在所有类中的每个构造函数中都将其作为参数传递,因此我要使用它,并且我已经传递了一个缓存参数,这似乎有点“过火”
没有更好的方法将用户ID传递给所有控制器吗
这是我的startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddSingleton<ILocationContainer, LocationContainer>();
services.AddDistributedMemoryCache();
services.AddHttpContextAccessor();
services.AddSession(options => {
options.IdleTimeout = TimeSpan.FromMinutes(20);
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});
services.AddMvc();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseAuthorization();
app.UseSession();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
在ASP.NET Core 1.0 RC1之前:它是System.Security.Claims命名空间中的User.GetUserId() 由于ASP.NET Core 1.0 RC2:您现在必须使用UserManager 在控制器中,您需要以下内容:
public class YourControllerNameController : Controller
{
private readonly UserManager<ApplicationUser> _userManager;
public YourControllerNameController(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
public async Task<IActionResult> YourMethodName()
{
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier) // will give the user's userId
var userName = User.FindFirstValue(ClaimTypes.Name) // will give the user's userName
ApplicationUser applicationUser = await _userManager.GetUserAsync(User);
string userEmail = applicationUser?.Email; // will give the user's Email
}
}
public类YourControllerNameController:Controller
{
私有只读UserManager直到ASP.NET Core 1.0 RC1:它是System.Security.Claims命名空间中的User.GetUserId()
由于ASP.NET Core 1.0 RC2:您现在必须使用UserManager
在控制器中,您需要以下内容:
public class YourControllerNameController : Controller
{
private readonly UserManager<ApplicationUser> _userManager;
public YourControllerNameController(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
public async Task<IActionResult> YourMethodName()
{
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier) // will give the user's userId
var userName = User.FindFirstValue(ClaimTypes.Name) // will give the user's userName
ApplicationUser applicationUser = await _userManager.GetUserAsync(User);
string userEmail = applicationUser?.Email; // will give the user's Email
}
}
public类YourControllerNameController:Controller
{
private readonly UserManager您可以创建一个基本控制器,并在需要用户信息的每个控制器中继承
public class CustomBaseController : ControllerBase
{
public UserInfo UserInfo
{
Id = User.FindFirstValue(ClaimTypes.NameIdentifier),
Name = User.FindFirstValue(ClaimTypes.Name),
PhoneNumber = User.FindFirstValue("PhoneNumber")
};
}
public class UserController : CustomBaseController
{
public IActionResult Login()
{
var user = _context.User.Find(UserInfo.Id);
// some code
}
}
您可以创建一个基本控制器并在需要用户信息的每个控制器中继承
public class CustomBaseController : ControllerBase
{
public UserInfo UserInfo
{
Id = User.FindFirstValue(ClaimTypes.NameIdentifier),
Name = User.FindFirstValue(ClaimTypes.Name),
PhoneNumber = User.FindFirstValue("PhoneNumber")
};
}
public class UserController : CustomBaseController
{
public IActionResult Login()
{
var user = _context.User.Find(UserInfo.Id);
// some code
}
}
这正是您不需要传递的数据类型。如果您使用identity,请在需要时使用可用的机制获取此数据。这正是您不需要传递的数据类型。如果您使用identity,请在需要时使用可用的机制获取此数据。感谢您的帮助,不幸的是,我们不应该使用EF框架或任何类型的数据库(我们使用JSON导出/导入,不要问我为什么,学院…)因此,使用Identity会非常复杂。我现在已经通过使用IHttpContextAccessor解决了这个问题,尽管Identity会使编码变得更加容易,尤其是在涉及用户角色时……感谢您的帮助,不幸的是,我们不应该使用EF框架或任何类型的数据库(我们使用JSON导出/导入,不要问我为什么,学院…)所以使用Identity会非常复杂。我现在已经通过使用IHttpContextAccessor解决了这个问题,尽管Identity会使编码变得更加容易,尤其是在涉及用户角色时……感谢您的帮助,我现在已经使用IHttpContextAccessor解决了这个问题,因为我们不能真正使用Identity类,请参阅上面的评论谢谢您的帮助帮助,我现在已经用IHttpContextAccessor解决了这个问题,因为我们不能真正识别类,请参见上面的注释