Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将带有HttpContext.Session的用户ID传递给其他控制器_C#_Asp.net Core_Model View Controller - Fatal编程技术网

C# 将带有HttpContext.Session的用户ID传递给其他控制器

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”

我已经搜索过类似的问题,但是由于一些语法发生了变化,我还没有找到我正在寻找的答案

我试图从Login/HomeController传递一个UserID,这样应用程序的所有控制器/视图都可以访问它。登录目前是硬编码的,因为我现在只是想传递一个值

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解决了这个问题,因为我们不能真正识别类,请参见上面的注释