ASP.NET Core Access User.Identity в конструкторе контроллера - PullRequest
0 голосов
/ 27 июня 2018

У меня есть сценарий, в котором мне нужно получить доступ к User.Identity утверждениям в контроллере моего конструктора.

Мне это нужно, потому что заявки имеют информацию, необходимую для ускорения пользовательского контекста БД (строка подключения)

Как я могу получить доступ к этому? Я бы просто вставил в DBContext, но в зависимости от пользователя, им может потребоваться доступ к другой БД.

Есть ли лучший способ думать об этом?

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

Ответы [ 4 ]

0 голосов
/ 27 декабря 2018

Из Рабии Аль-Тараде выше ссылка:

    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();
   }
}
0 голосов
/ 28 июня 2018

Чтобы получить доступ к утверждениям User.Identity в ядре .Net, вам нужно использовать 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;
        }

Подробности реализации можно найти здесь

Пожалуйста, дайте мне знать, если у вас возникли проблемы

0 голосов
/ 18 августа 2018

Начиная с версии 2.1 ASP.NET Core, предоставляется HttpContextAccessor. Для этого мы должны выполнить следующие шаги:

Сконфигурируйте сервис, используя стандартную реализацию в методе ConfigureServices Startup.cs:

services.AddHttpContextAccessor();

Выполните внедрение зависимостей IHttpContextAccessor на контроллерах. Используйте HttpContext свойство для доступа к User

[Authorize]
public class DefaultController : Controller
{
    public DefaultController(IHttpContextAccessor contextAccessor)
    {
        // Here HttpContext is not Null :)
        var authenticatedUser = contextAccessor.HttpContext.User.Identity.Name;
    }
}
0 голосов
/ 28 июня 2018
 This code I using to get the calims

 --------

      int user_id = 0;
      int Account_id = 0;
      List<string> roles;

    public TEMP_CON_Controller(DatabaseContext context,IHttpContextAccessor,httpContextAccessor)
    {
      _context = context;
      if (httpContextAccessor.HttpContext.User.Identity.IsAuthenticated)
      {
        var user = httpContextAccessor.HttpContext.User;

        this.user_id = int.Parse(user.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value);

        IEnumerable<Claim> claims = user.Claims;

        var accId = claims.Where(x => x.Type == "AccountId").Select(c => c.Value).SingleOrDefault();

        if (!string.IsNullOrEmpty(accId))
          this.Account_id = Int32.Parse(accId);

        roles = claims.Where(x => x.Type == ClaimTypes.Role).Select(c => c.Value).ToList();


      }
    }
​
...