[asp.net] ASP.NET Core에서 현재 로그인 한 사용자 ID를 얻는 방법

이전에 MVC5를 사용 하여이 작업을 수행 User.Identity.GetUserId()했지만 여기서는 작동하지 않는 것 같습니다. User.Identity나던은이 GetUserId()방법을

나는 사용하고있다 Microsoft.AspNet.Identity



답변

ASP.NET Core 버전> = 2.0의 업데이트

컨트롤러에서 :

public class YourControllerNameController : Controller
{
    private readonly UserManager<ApplicationUser> _userManager;

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

    public async Task<IActionResult> YourMethodName()
    {
        var userId =  User.FindFirstValue(ClaimTypes.NameIdentifier) // will give the user's userId
        var userName =  User.FindFirstValue(ClaimTypes.Name) // will give the user's userName

        ApplicationUser applicationUser = await _userManager.GetUserAsync(User);
        string userEmail = applicationUser?.Email; // 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.FindFirstValue(ClaimTypes.NameIdentifier);
   }
}

그럼 당신은 등록해야 IHttpContextAccessor에서 Startup다음과 같이 클래스 :

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

    // Or you can also register as follows

    services.AddHttpContextAccessor();
}

가독성을 높이려면 다음과 같이 확장 방법을 작성하십시오.

public static class ClaimsPrincipalExtensions
{
    public static T GetLoggedInUserId<T>(this ClaimsPrincipal principal)
    {
        if (principal == null)
            throw new ArgumentNullException(nameof(principal));

        var loggedInUserId = principal.FindFirstValue(ClaimTypes.NameIdentifier);

        if (typeof(T) == typeof(string))
        {
            return (T)Convert.ChangeType(loggedInUserId, typeof(T));
        }
        else if (typeof(T) == typeof(int) || typeof(T) == typeof(long))
        {
            return loggedInUserId != null ? (T)Convert.ChangeType(loggedInUserId, typeof(T)) : (T)Convert.ChangeType(0, typeof(T));
        }
        else
        {
            throw new Exception("Invalid type provided");
        }
    }

    public static string GetLoggedInUserName(this ClaimsPrincipal principal)
    {
        if (principal == null)
            throw new ArgumentNullException(nameof(principal));

        return principal.FindFirstValue(ClaimTypes.Name);
    }

    public static string GetLoggedInUserEmail(this ClaimsPrincipal principal)
    {
        if (principal == null)
            throw new ArgumentNullException(nameof(principal));

        return principal.FindFirstValue(ClaimTypes.Email);
    }
}

그런 다음 다음과 같이 사용하십시오.

public class YourControllerNameController : Controller
{
    public IActionResult YourMethodName()
    {
        var userId = User.GetLoggedInUserId<string>(); // Specify the type of your UserId;
        var userName = User.GetLoggedInUserName();
        var userEmail = User.GetLoggedInUserEmail();
    }
}

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

     public void YourMethodName()
     {
         var userId = _httpContextAccessor.HttpContext.User.GetLoggedInUserId<string>(); // Specify the type of your UserId;
     }
}


답변

ASP.NET Core 1.0 RC1 까지 :

System.Security.Claims 네임 스페이스 의 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 이외의 다른 솔루션을 사용하는 것과 같이 사용자 관리 시스템을 변경하기로 결정하면 전체 코드를 검토해야하기 때문에 고통스러워지기 때문에 사용자를 얻는 방법을 분리하는 것이 좋습니다.


답변

컨트롤러에서 얻을 수 있습니다.

using System.Security.Claims;
var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);

또는 .Core v1.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());
        }
    }
}


답변

System.Security.Claims를 사용하여 포함 시켰으며 GetUserId () 확장 메서드에 액세스 할 수있었습니다.

NB : Microsoft.AspNet.Identity를 이미 사용하고 있었지만 확장 방법을 얻을 수 없었습니다. 둘 다 서로 함께 사용해야한다고 생각합니다

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

편집 :이 답변은 이제 구식입니다. CORE 1.0에서 Soren 또는 Adrien의 답변을 확인하십시오.


답변

.NET Core 2.0 만 해당 Controller클래스 에서 로그인 한 사용자의 UserID를 가져 오려면 다음이 필요합니다 .

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

또는

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

예 :

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


답변

이 게시물의 어딘가에 언급 된 것처럼 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를 추가해야합니다. 그렇지 않으면 이것은 이미 그렇습니다.


답변

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