我以前用MVC5使用做到了这一点User.Identity.GetUserId()
但似乎并不在这里工作。 所述User.Identity
不必须的GetUserId()
方法
我使用Microsoft.AspNet.Identity
我以前用MVC5使用做到了这一点User.Identity.GetUserId()
但似乎并不在这里工作。 所述User.Identity
不必须的GetUserId()
方法
我使用Microsoft.AspNet.Identity
直到ASP.NET 1.0的核心RC1:
这是User.GetUserId()从System.Security.Claims命名空间。
由于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
,但它不尊重单一职责原则。 最好是你得到用户的方式隔离,因为如果哪天你想改变你的用户管理系统,如使用比标识另一种解决方案,它会得到痛苦的,因为你必须检查你的全部代码。
你可以在你的控制器得到它:
var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
或写入的扩展方法等。核心1.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());
}
}
}
在控制器:
public class YourControllerNameController : Controller
{
public IActionResult YourMethodName()
{
var userId = User.FindFirst(ClaimTypes.NameIdentifier).Value // will give the user's userId
var userName = User.FindFirst(ClaimTypes.Name).Value // will give the user's userName
var userEmail = User.FindFirst(ClaimTypes.Email).Value // 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.FindFirst(ClaimTypes.NameIdentifier).Value;
// or
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();
}
我包括使用System.Security.Claims,我可以访问GetUserId()扩展方法
注:我有使用Microsoft.AspNet.Identity已经但是不能得到扩展方法。 所以我想他们都在结合使用彼此
using Microsoft.AspNet.Identity;
using System.Security.Claims;
编辑 :这个答案现在已经过时。 看看索伦的或阿德里安的回答为核心1.0实现这一目标的一个过时的方法
对于.NET核2.0仅仅需要获取在登录的用户的用户ID下面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。 否则,这应该已经是这种情况。
虽然阿德里安的答案是正确的,你可以做到这一切在单行。 无需额外的功能或混乱。
它的工作原理我检查了它在ASP.NET 1.0的核心
var user = await _userManager.GetUserAsync(HttpContext.User);
那么你就可以得到像变量的其他属性user.Email
。 我希望这可以帮助别人。
对于ASP.NET核2.0,实体框架核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&接口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 2.2核心)
如果您在ASP.NET MVC控制器希望这样,使用
using Microsoft.AspNet.Identity;
User.Identity.GetUserId();
您需要添加using
语句,因为GetUserId()
不会在那里没有它。