web-dev-qa-db-ja.com

ControllerコンストラクターのASP.NET Core Access User.Identity

コンストラクターのコントローラーでUser.Identity Claimsにアクセスする必要があるシナリオがあります。

クレームには、カスタムDBコンテキスト(接続文字列)を起動するために必要な情報があるため、これが必要です。

これにアクセスするにはどうすればよいですか? DBContextに挿入するだけですが、ユーザーによっては、異なるDBにアクセスする必要がある場合があります。

これについて考えるより良い方法はありますか?

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

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


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

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

実装の詳細は here にあります。

問題があれば教えてください

0
user4851087