如何获取当前login的用户标识ASP.NET Core

我已经使用User.Identity.GetUserId()使用MVC5做了这个,但是这似乎不工作在这里。 User.Identity没有GetUserId()方法

我正在使用Microsoft.AspNet.Identity

直到ASP.NET Core 1.0 RC1

它来自System.Security.Claims命名空间的User.GetUserId()。

由于ASP.NET Core 1.0 RC2

您现在已经使用UserManager 。 您可以创build一个获取当前用户的方法:

 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的方法的情况下完成它,但是它不遵守单一的响应原则。 最好隔离你得到用户的方式,因为如果有一天你决定改变你的用户pipe理系统,比如使用另一个解决scheme而不是Identity,那么如果你必须查看你的整个代码,那将是很痛苦的。

我包括使用System.Security.Claims,我可以访问GetUserId()扩展方法

注意:我已经使用了Microsoft.AspNet.Identity,但无法获得扩展方法。 所以我想他们俩都必须一起使用

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

编辑 :这个答案现在是过时的。 看看Soren或Adrien的回答,在CORE1.0中达到这个目标的方法是过时的

你可以在你的控制器中获得它:

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

正如在这篇文章中介绍的那样,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到你的服务。 否则,这应该已经是这样了。

虽然阿德里安的答案是正确的,但你可以单独做这件事。 无需额外的function或混乱。

它的工作原理我检查了它在ASP.NET核心1.0

 var user = await _userManager.GetUserAsync(HttpContext.User); 

那么你可以得到像user.Email这样的variables的其他属性。 我希望这可以帮助别人。

你必须导入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); 

如果你想在ASP.NET MVC控制器中使用这个

 using Microsoft.AspNet.Identity; User.Identity.GetUserId(); 

你需要添加using语句,因为GetUserId()不会没有它。