web-dev-qa-db-fra.com

Identité utilisateur.Identity ASP.NET Core Access dans le constructeur du contrôleur

J'ai un scénario où je dois accéder à User.Identity Claims dans le contrôleur de mon constructeur.

J'ai besoin de cela car les revendications ont des informations nécessaires pour créer un contexte de base de données personnalisé (chaîne de connexion)

Comment puis-je y accéder? Je voudrais simplement injecter dans le contexte DBC, mais en fonction de l'utilisateur, il peut être nécessaire d'accéder à une base de données différente.

Y a-t-il une meilleure façon de penser à cela?

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

A partir de la version 2.1 d'ASP.NET Core, HttpContextAccessor est fourni. Pour cela, nous devons suivre les étapes suivantes:

Configurez le service à l'aide de l'implémentation standard dans la méthode ConfigureServices de Startup.cs:

services.AddHttpContextAccessor();

Effectuez l'injection de dépendance de IHttpContextAccessor sur les contrôleurs. Utilisez la propriété HttpContext pour accéder à User

[Authorize]
public class DefaultController : Controller
{
    public DefaultController(IHttpContextAccessor contextAccessor)
    {
        // Here HttpContext is not Null :)
        var authenticatedUser = contextAccessor.HttpContext.User.Identity.Name;
    }
}
5
batressc
 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();


      }
    }
​
1
Rabea AlTaradeh

De Rabea AlTaradeh lien ci-dessus:

    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
twc

Pour accéder aux revendications User.Identity dans le noyau .Net, vous devez utiliser HttpContext. Voici ma mise en œuvre ci-dessous

Premier enregistrement 

services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();

Et puis enregistrez-vous dans la classe Service ou Controller

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;
        }

Le détail de la mise en œuvre peut être trouvé ici

S'il vous plaît laissez-moi savoir si vous avez un problème

0
Ngô Hùng Phúc