Я робив це раніше з використанням 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 :
Це User.GetUserId () від System.Security.Claimspace namespace.
Оскільки 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))
для отримання цілого UserId
Я включив, використовуючи System.Security.Claims, і я міг отримати доступ до методу розширення GetUserId ()
NB: Я вже використовував Microsoft.AspNet.Identity, але метод розширення не міг. Тому я думаю, що їх обох треба використовувати спільно один з одним
using Microsoft.AspNet.Identity;
using System.Security.Claims;
EDIT : Ця відповідь застаріла. Подивіться на відповідь Сорена або Адрієна щодо датованого способу досягнення цього в CORE 1.0
var userId = 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. Інакше це вже має бути так.
вам потрібно імпортувати 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);
?
Хоча відповідь Адрієна правильна, ви можете зробити це все в один рядок. Не потрібно додаткової функції чи безладу.
Він працює, я перевірив його в 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. Я використовую автоматично збільшений первинний ключ для таблиці моєї ідентичності користувача, отже, int.Parse. int userId = int.Parse(this.User.FindFirstValue(ClaimTypes.NameIdentifier));
FindByIdAsync
не працює, коли ви надаєте ім’я користувача. Він працює, коли ви заміните його на FindByNameAsync
.
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();
Спасибі, Максуде
Щоб отримати поточний ідентифікатор користувача у видах бритви, ми можемо вставити UserManager у подання таким чином:
@inject Microsoft.AspNetCore.Identity.UserManager<ApplicationUser> _userManager
@{ string userId = _userManager.GetUserId(User); }
Сподіваюсь, вам це стане в нагоді.
Оскільки адміністратор, який працює над профілем інших людей, і вам потрібно отримати ідентифікатор профілю, над яким ви працюєте, ви можете використовувати ViewBag для захоплення ідентифікатора, наприклад ViewBag.UserId = userId; while 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 Controller, використовуйте
using Microsoft.AspNet.Identity;
User.Identity.GetUserId();
Вам потрібно додати using
заяву, оскільки GetUserId()
без неї не буде.
User.GetUserId()
а неUser.Identity.GetUserId()
System.Web.HttpContext.Current.User.Identity.Name
?