我之前使用MVC5做到了这一点,User.Identity.GetUserId()
但是在这里似乎不起作用。本User.Identity
可是没有的GetUserId()
方法
我在用 Microsoft.AspNet.Identity
我之前使用MVC5做到了这一点,User.Identity.GetUserId()
但是在这里似乎不起作用。本User.Identity
可是没有的GetUserId()
方法
我在用 Microsoft.AspNet.Identity
Answers:
在控制器中:
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 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()扩展方法
注意:我已经使用过Microsoft.AspNet.Identity,但是无法获取扩展方法。因此,我认为它们必须相互结合使用
using Microsoft.AspNet.Identity;
using System.Security.Claims;
编辑:这个答案现在已经过时了。查看Soren或Adrien的答案以了解在CORE 1.0中实现此目标的过时方法
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。我为身份用户表使用自动递增的主键,因此使用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();
谢谢,马克苏德
作为管理其他人的个人资料的管理员,您需要获取正在使用的个人资料的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 Controller中使用此功能,请使用
using Microsoft.AspNet.Identity;
User.Identity.GetUserId();
您需要添加using
语句,因为GetUserId()
没有它就不会存在。
User.GetUserId()
不是User.Identity.GetUserId()
System.Web.HttpContext.Current.User.Identity.Name
?