Я уже делал это с MVC5 с помощью User.Identity.GetUserId()
, но, похоже, это не работает.
User.Identity
не имеет метода GetUserId()
Я использую Microsoft.AspNet.Identity
Я уже делал это с MVC5 с помощью User.Identity.GetUserId()
, но, похоже, это не работает.
User.Identity
не имеет метода GetUserId()
Я использую Microsoft.AspNet.Identity
Я включил использование System.Security.Claim, и я мог получить доступ к методу расширения GetUserId()
NB: Я уже использовал Microsoft.AspNet.Identity, но не смог получить метод расширения. Поэтому я думаю, что оба они должны использоваться в сочетании друг с другом.
using Microsoft.AspNet.Identity;
using System.Security.Claims;
ИЗМЕНИТЬ: Этот ответ теперь устарел. Посмотрите на Soren или Adrien ответ на датированный путь достижения этого в CORE 1.0
До ASP.NET Core 1.0 RC1:
Он User.GetUserId() из пространства имен System.Security.Claims.
Поскольку 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, это станет болезненным, так как вам придется просмотреть весь ваш код.
В контроллере:
public class YourControllerNameController : Controller
{
public IActionResult YourMethodName()
{
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier) // will give the user userId
var userName = User.FindFirstValue(ClaimTypes.Name) // will give the user userName
var userEmail = User.FindFirstValue(ClaimTypes.Email) // will give the user 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;
}
}
вы можете получить его в своем контроллере:
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());
}
}
}
Только для.NET Core 2.0 Для извлечения UserID зарегистрированного пользователя в классе Controller
требуется следующее:
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);
}
Если вы запустили пустой проект, вам может потребоваться добавить UserManger к вашим услугам в startup.cs. В противном случае это уже должно быть.
Хотя ответ 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,
});
}
Отклик:
вам нужно импортировать 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);
в APiController
User.FindFirst(ClaimTypes.NameIdentifier).Value
Что-то вроде этого вы получите претензии
User.Identity.GetUserId();
не существует в ядре идентификатора asp.net 2.0. в этом отношении я управлял по-разному. я создал общий класс для использования всего приложения из-за получения информации о пользователе.
создать общий класс PCommon & interface 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));
}
}
}
получить имя пользователя и имя в действии вставки
_iPCommon.GetUserId();
Спасибо, Максуд
использовать можно использовать
string userid = User.FindFirst("id").Value;
по какой-то причине NameIdentifier теперь получает имя пользователя (.net core 2.2)
Если вы хотите это в ASP.NET MVC Controller, используйте
using Microsoft.AspNet.Identity;
User.Identity.GetUserId();
Вам нужно добавить оператор using
, потому что GetUserId()
не будет там без него.