簡體   English   中英

控制器構造函數中的 ASP.NET Core 訪問 User.Identity

[英]ASP.NET Core Access User.Identity in Controller Constructor

我有一個場景,我需要在我的構造函數的控制器中訪問User.Identity Claims。

我需要這個,因為聲明有我啟動自定義數據庫上下文(連接字符串)所需的信息

我怎樣才能訪問這個? 我只想注入 DBContext,但根據用戶,他們可能需要訪問不同的數據庫。

有沒有更好的方法來考慮這個問題?

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

從 ASP.NET Core 2.1 版開始,提供了HttpContextAccessor 為此,我們必須遵循以下步驟:

使用Startup.csConfigureServices方法中的標准實現配置服務:

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


      }
    }
​

要訪問 .Net 核心中的 User.Identity Claims,您需要使用 HttpContext。 這是我的以下實現

第一次注冊

services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();

然后在 Service 或 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;
        }

實現的細節可以在這里找到

如果您有任何問題,請告訴我

來自上面鏈接的 Rabea AlTaradeh:

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

在 Asp.net Core v.2+ 中,您不必注入 HttpContext 或其他東西。 訪問用戶就像這樣:

public IActionResult GetMe()
{
    return Ok(User.Identity.Name);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM