이전에 MVC5를 사용 하여이 작업을 수행 User.Identity.GetUserId()
했지만 여기서는 작동하지 않는 것 같습니다. User.Identity
나던은이 GetUserId()
방법을
나는 사용하고있다 Microsoft.AspNet.Identity
이전에 MVC5를 사용 하여이 작업을 수행 User.Identity.GetUserId()
했지만 여기서는 작동하지 않는 것 같습니다. User.Identity
나던은이 GetUserId()
방법을
나는 사용하고있다 Microsoft.AspNet.Identity
답변:
컨트롤러에서 :
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;
}
}
null
있습니다.
User.Identity.Name
익명 인증이 활성화되어 있기 때문일 수 있습니다. 내가 얻을 수있었습니다 User.Identity.Name
확대하여 내 도메인과 사용자 이름을 반환 Properties > launchSettings.json
하고, 설정 anonymousAuthentication
에 false
, 그리고 windowsAuthentication
에 true
.
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());
}
}
}
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
Convert.ToInt32(User.FindFirstValue(ClaimTypes.NameIdentifier))
사용자 아이디 정수를 얻을 수
System.Security.Claims를 사용하여 포함 시켰으며 GetUserId () 확장 메서드에 액세스 할 수있었습니다.
NB : Microsoft.AspNet.Identity를 이미 사용하고 있었지만 확장 방법을 얻을 수 없었습니다. 둘 다 서로 함께 사용해야한다고 생각합니다
using Microsoft.AspNet.Identity;
using System.Security.Claims;
편집 :이 답변은 이제 구식입니다. CORE 1.0에서 Soren 또는 Adrien의 답변을 확인하십시오.
var userId = User.GetUserId();
이 게시물의 어딘가에 언급 된 것처럼 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);
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"
에 대한 User.FindFirstValue(ClaimTypes.NameIdentifier);
?
Adrien의 대답은 정확하지만 한 줄 로이 작업을 수행 할 수 있습니다. 추가 기능이나 혼란이 필요하지 않습니다.
ASP.NET Core 1.0에서 확인했습니다.
var user = await _userManager.GetUserAsync(HttpContext.User);
그런 다음과 같은 변수의 다른 속성을 얻을 수 있습니다 user.Email
. 나는 이것이 누군가를 돕기를 바랍니다.
ASP.NET Core 2.0, Entity Framework Core 2.0, AspNetCore.Identity 2.0 api ( https://github.com/kkagill/ContosoUniversity-Backend )의 경우 :
Id
로 변경되었습니다User.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,
});
}
응답:
this.User.Identity.Name
하지만 사용자 이름 인 경향이 있습니다. 내 테스트에서 사용자 이름은 이메일이며 등록에서 사용자 로그인하거나 외부 로그인 (예 : Facebook, Google)에서 로그인합니다. 다음 코드는 userId를 반환합니다. ID 사용자 테이블에 자동 증분 기본 키를 사용하므로 int.Parse입니다. int userId = int.Parse(this.User.FindFirstValue(ClaimTypes.NameIdentifier));
FindByIdAsync
사용자 이름을 제공하는 동안 작동하지 않습니다. 로 교체하면 작동합니다 FindByNameAsync
.
User.Identity.GetUserId ();
asp.net ID 코어 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
다른 사람의 프로필을 작업하는 관리자로서 작업중인 프로필의 ID를 가져와야하는 경우 ViewBag를 사용하여 ID를 캡처 할 수 있습니다. 예 : ViewBag.UserId = userId; userId는 작업중인 메소드의 문자열 매개 변수입니다.
[HttpGet]
public async Task<IActionResult> ManageUserRoles(string userId)
{
ViewBag.UserId = userId;
var user = await userManager.FindByIdAsync(userId);
if (user == null)
{
ViewBag.ErrorMessage = $"User with Id = {userId} cannot be found";
return View("NotFound");
}
var model = new List<UserRolesViewModel>();
foreach (var role in roleManager.Roles)
{
var userRolesViewModel = new UserRolesViewModel
{
RoleId = role.Id,
RoleName = role.Name
};
if (await userManager.IsInRoleAsync(user, role.Name))
{
userRolesViewModel.IsSelected = true;
}
else
{
userRolesViewModel.IsSelected = false;
}
model.Add(userRolesViewModel);
}
return View(model);
}
ASP.NET MVC 컨트롤러에서이 기능을 사용하려면
using Microsoft.AspNet.Identity;
User.Identity.GetUserId();
using
문 GetUserId()
이 없으면 문 을 추가해야 합니다.
User.GetUserId()
User.Identity.GetUserId()
System.Web.HttpContext.Current.User.Identity.Name
?