it-swarm.com.de

ASP.NET Core Access User.Identity im Controller-Konstruktor

Ich habe ein Szenario, in dem ich auf User.Identity Claims im Controller meines Konstruktors zugreifen muss.

Ich brauche das, weil die Claims Informationen enthalten, die ich für das Anfahren eines benutzerdefinierten DB-Kontexts (Verbindungszeichenfolge) benötigt.

Wie kann ich darauf zugreifen? Ich würde einfach in den DBContext injizieren, aber je nach Benutzer müssen sie möglicherweise auf eine andere Datenbank zugreifen.

Gibt es eine bessere Möglichkeit, darüber nachzudenken?

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

Ab Version 2.1 von ASP.NET Core wird HttpContextAccessor bereitgestellt. Dazu müssen wir die folgenden Schritte ausführen:

Konfigurieren Sie den Service mithilfe der Standardimplementierung in der ConfigureServices-Methode von Startup.cs:

services.AddHttpContextAccessor();

Führen Sie die Abhängigkeitsinjektion von IHttpContextAccessor auf den Controllern durch. Verwenden Sie die HttpContext-Eigenschaft für den Zugriff auf 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

Von Rabea AlTaradeh über dem Link:

    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

Um auf User.Identity Claims im .Net Core zugreifen zu können, müssen Sie HttpContext verwenden. Hier ist meine untenstehende Implementierung

Erstes Register 

services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();

Dann registrieren Sie sich in der Service- oder Controller-Klasse

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

Die Details der Implementierung finden Sie hier

Bitte lassen Sie mich wissen, wenn Sie Probleme haben

0