web-dev-qa-db-ja.com

ASP.NET Coreで現在のログインユーザーIDを取得する方法

私は以前MVC5でUser.Identity.GetUserId()を使ってこれを行いましたが、それはここではうまくいかないようです。 User.IdentityGetUserId()メソッドを持っていません

私はMicrosoft.AspNet.Identityを使っています

114
MRainzo

System.Security.Claimsを使用して含めたので、GetUserId()拡張メソッドにアクセスできました。

注意:私はすでにMicrosoft.AspNet.Identityを使用していましたが、拡張メソッドを取得できませんでした。だから私はそれらの両方がお互いに関連して使用されなければならないと思います

using Microsoft.AspNet.Identity;
using System.Security.Claims;

EDIT:この答えは古くなっています。 CORE 1.0でこれを達成するための時代遅れの方法についてのSorenまたはAdrienの答えを見てください。

36
MRainzo

ASP.NET Core 1.0RC1まで

それは System.Security.Claims namespaceからのUser.GetUserId()です。

ASP.NET Core 1.0以降RC2

あなたは今 UserManager を使わなければなりません。現在のユーザーを取得するためのメソッドを作成できます。

private Task<ApplicationUser> GetCurrentUserAsync() => _userManager.GetUserAsync(HttpContext.User);

そしてオブジェクトを使ってユーザー情報を取得します。

var user = await GetCurrentUserAsync();

var userId = user?.Id;
string mail = user?.Email;

注: このstring mail = (await _userManager.GetUserAsync(HttpContext.User))?.Emailのように単一行を書く方法を使わなくても実行できますが、単一の責任は尊重されません。原理。いつかIdentity以外のソリューションを使用するなど、いつかユーザー管理システムを変更することにした場合は、コード全体を見直す必要があるため、ユーザーを取得する方法を切り分けることをお勧めします。

94
AdrienTorris

あなたはそれをあなたのコントローラーに入れることができます:

var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);

または以前のような拡張方法を書く。Corev1.0

using System;
using System.Security.Claims;

namespace Shared.Web.MvcExtensions
{
    public static class ClaimsPrincipalExtensions
    {
        public static string GetUserId(this ClaimsPrincipal principal)
        {
            if (principal == null)
                throw new ArgumentNullException(nameof(principal));

            return principal.FindFirst(ClaimTypes.NameIdentifier)?.Value;
        }
    }
}

そして、ユーザーのClaimsPrincipalが利用可能な場所に移動します。

using Microsoft.AspNetCore.Mvc;
using Shared.Web.MvcExtensions;

namespace Web.Site.Controllers
{
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return Content(this.User.GetUserId());
        }
    }
}
70
Soren

ASP.NET Core 2.1および2.2で更新します。

コントローラー内:

public class YourControllerNameController : Controller
{
    public IActionResult YourMethodName()
    {
        var userId =  User.FindFirst(ClaimTypes.NameIdentifier).Value // will give the user's userId
        var userName =  User.FindFirst(ClaimTypes.Name).Value // will give the user's userName
        var userEmail =  User.FindFirst(ClaimTypes.Email).Value // will give the user's Email
    }
}

他のクラスでは

public class OtherClass
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    public OtherClass(IHttpContextAccessor httpContextAccessor)
    {
       _httpContextAccessor = httpContextAccessor;
    }

   public void YourMethodName()
   {
      var userId = _httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
      // or
      var userId = _httpContextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
   }
}

次に、IHttpContextAccessorStartupクラスに次のように登録します。

public void ConfigureServices(IServiceCollection services)
{
    services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

    // Or you can also register as follows

    services.AddHttpContextAccessor();
}
61
TanvirArjel

.NET Core 2.0の場合のみControllerクラスでログインしているユーザーのユーザーIDを取得するには、以下が必要です。

var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);

または

var userId = HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);

例えば.

contact.OwnerID = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
22
Oracular Man

この記事のどこかで述べたように、GetUserId()メソッドはUserManagerに移動されました。

private readonly UserManager<ApplicationUser> _userManager;

public YourController(UserManager<ApplicationUser> userManager)
{
    _userManager = userManager;
}

public IActionResult MyAction()
{
    var userId = _userManager.GetUserId(HttpContext.User);

    var model = GetSomeModelByUserId(userId);

    return View(model);
}

空のプロジェクトを開始した場合は、startup.csのサービスにUserMangerを追加する必要があります。そうでなければ、これはすでに当てはまるはずです。

14
Menno Guldemond

エイドリアンの答えは正しいですが、あなたはこれをすべて一行で行うことができます。追加機能や混乱の必要はありません。

ASP.NET Core 1.0で確認しました

var user = await _userManager.GetUserAsync(HttpContext.User);

それからuser.Emailのような変数の他のプロパティを取得できます。これが誰かに役立つことを願っています。

5
Ahmad

ASP.NET Core 2.0、Entity Framework Core 2.0、AspNetCore.Identity 2.0 API( https://github.com/kkagill/ContosoUniversity-Backend ) :

IdUser.Identity.Nameに変更されました

    [Authorize, HttpGet("Profile")]
    public async Task<IActionResult> GetProfile()
    {
        var user = await _userManager.FindByIdAsync(User.Identity.Name);

        return Json(new
        {
            IsAuthenticated = User.Identity.IsAuthenticated,
            Id = User.Identity.Name,
            Name = $"{user.FirstName} {user.LastName}",
            Type = User.Identity.AuthenticationType,
        });
    }

応答:

enter image description here

5
jv_

microsoft.AspNetCore.Identity&System.Security.Claimsをインポートする必要があります

// to get current user ID
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);

// to get current user info
var user = await _userManager.FindByIdAsync(userId);
4
Mansur Haider

APiController

User.FindFirst(ClaimTypes.NameIdentifier).Value

このようなものはあなたが主張を得るでしょう

2
Usman

User.Identity.GetUserId();

asp.netアイデンティティコア2.0には存在しません。この点で、私は別の方法で管理しました。ユーザー情報を取得するため、アプリケーション全体を使用するための共通クラスを作成しました。

共通クラスPCommonとインターフェースIPCommonを作成し、参照を追加しますusing System.Security.Claims

using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;

namespace Common.Web.Helper
{
    public class PCommon: IPCommon
    {
        private readonly IHttpContextAccessor _context;
        public PayraCommon(IHttpContextAccessor context)
        {
            _context = context;
        }
        public int GetUserId()
        {
            return Convert.ToInt16(_context.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier));
        }
        public string GetUserName()
        {
            return _context.HttpContext.User.Identity.Name;
        }

    }
    public interface IPCommon
    {
        int GetUserId();
        string GetUserName();        
    }    
}

ここで共通クラスの実装

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.Extensions.Logging;
using Pay.DataManager.Concreate;
using Pay.DataManager.Helper;
using Pay.DataManager.Models;
using Pay.Web.Helper;
using Pay.Web.Models.GeneralViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Pay.Controllers
{

    [Authorize]
    public class BankController : Controller
    {

        private readonly IUnitOfWork _unitOfWork;
        private readonly ILogger _logger;
        private readonly IPCommon _iPCommon;


        public BankController(IUnitOfWork unitOfWork, IPCommon IPCommon, ILogger logger = null)
        {
            _unitOfWork = unitOfWork;
            _iPCommon = IPCommon;
            if (logger != null) { _logger = logger; }
        }


        public ActionResult Create()
        {
            BankViewModel _bank = new BankViewModel();
            CountryLoad(_bank);
            return View();
        }

        [HttpPost, ActionName("Create")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Insert(BankViewModel bankVM)
        {

            if (!ModelState.IsValid)
            {
                CountryLoad(bankVM);
                //TempData["show-message"] = Notification.Show(CommonMessage.RequiredFieldError("bank"), "Warning", type: ToastType.Warning);
                return View(bankVM);
            }


            try
            {
                bankVM.EntryBy = _iPCommon.GetUserId();
                var userName = _iPCommon.GetUserName()();
                //_unitOfWork.BankRepo.Add(ModelAdapter.ModelMap(new Bank(), bankVM));
                //_unitOfWork.Save();
               // TempData["show-message"] = Notification.Show(CommonMessage.SaveMessage(), "Success", type: ToastType.Success);
            }
            catch (Exception ex)
            {
               // TempData["show-message"] = Notification.Show(CommonMessage.SaveErrorMessage("bank"), "Error", type: ToastType.Error);
            }
            return RedirectToAction(nameof(Index));
        }



    }
}

挿入アクションでuserIdと名前を取得します。

_iPCommon.GetUserId();

ありがとう、Maksud

1
Maksud

使用できます

string userid = User.FindFirst("id").Value;

何らかの理由でNameIdentifierがユーザ名を取得するようになりました(.net core 2.2)

0
Mosta