Передайте UserID с HttpContext.Session другому контроллеру - PullRequest
0 голосов
/ 19 июня 2020

Я уже искал похожие вопросы, но, поскольку некоторые синтаксисы изменились, я еще не нашел ответ, который ищу.

Я пытаюсь передать UserID из Login / HomeController , поэтому все контроллеры / представления приложения могут получить к нему доступ. Логин на данный момент жестко запрограммирован, так как я просто пытаюсь передать значение прямо сейчас.

Session["key"] не работает, как и HttpContext.Current, которого даже нет в последней версии MVC. В самом HomeController я могу добавлять значения с помощью HttpContext.Session.SetString(Key, "string"), но я не знаю, как получить к нему доступ в других контроллерах / представлениях.

Я нашел IHttpContextAccessor, но так как я должен передать это как параметр в каждом отдельном конструкторе во всем классе, который я хочу использовать, и я уже передаю параметр кеша, это кажется скорее «излишним»

Нет лучшего способа передать UserID всему контроллеру?

Это мой 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?}");
            });
        }

Это мой код в контроллере

public IActionResult Login()
        {
            HttpContext.Session.SetString(UserAccount, "blabla");
            HttpContext.Session.SetString(UserRole, "admin");
            return RedirectToAction("Index", "Home");

        }

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Вы можете создать базовый контроллер и наследовать каждый контроллер, который вам нужен. Информация о пользователе.

  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
    }
}
0 голосов
/ 19 июня 2020

До ASP. NET Core 1.0 RC1: это User.GetUserId () из пространства имен System.Security.Claims.

Начиная с 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
 }
}

В этом аспекте много информации, вы должны прочитать это: { ссылка }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...