如何获取当前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()
不会没有它。