Tôi đã làm điều này trước đây với MVC5 bằng cách sử dụng User.Identity.GetUserId()
nhưng dường như không hoạt động ở đây. Các User.Identity
doesnt có GetUserId()
phương pháp
tôi đang dùng Microsoft.AspNet.Identity
Tôi đã làm điều này trước đây với MVC5 bằng cách sử dụng User.Identity.GetUserId()
nhưng dường như không hoạt động ở đây. Các User.Identity
doesnt có GetUserId()
phương pháp
tôi đang dùng Microsoft.AspNet.Identity
Câu trả lời:
Trong Bộ điều khiển:
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
}
}
Trong một số lớp khác:
public class OtherClass
{
private readonly IHttpContextAccessor _httpContextAccessor;
public OtherClass(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void YourMethodName()
{
var userId = _httpContextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
}
}
Sau đó, bạn nên đăng ký IHttpContextAccessor
trong Startup
lớp như sau:
public void ConfigureServices(IServiceCollection services)
{
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
// Or you can also register as follows
services.AddHttpContextAccessor();
}
Để dễ đọc hơn, hãy viết các phương thức mở rộng như sau:
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);
}
}
Sau đó sử dụng như sau:
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
đó, thì đó có thể là do Xác thực ẩn danh được bật. Tôi đã có thể để có được User.Identity.Name
trở lại tên miền của tôi và tên người dùng bằng cách mở rộng Properties > launchSettings.json
, và thiết lập anonymousAuthentication
để false
, và windowsAuthentication
để true
.
Cho đến khi ASP.NET Core 1.0 RC1 :
Đó là User.GetUserId () từ không gian tên System.Security.Claims .
Kể từ ASP.NET Core 1.0 RC2 :
Bây giờ bạn phải sử dụng UserManager . Bạn có thể tạo một phương thức để có được người dùng hiện tại:
private Task<ApplicationUser> GetCurrentUserAsync() => _userManager.GetUserAsync(HttpContext.User);
Và lấy thông tin người dùng với đối tượng:
var user = await GetCurrentUserAsync();
var userId = user?.Id;
string mail = user?.Email;
Lưu ý:
Bạn có thể làm điều đó mà không cần sử dụng phương pháp viết các dòng đơn như thế này string mail = (await _userManager.GetUserAsync(HttpContext.User))?.Email
, nhưng nó không tôn trọng nguyên tắc trách nhiệm duy nhất. Tốt hơn hết là cô lập cách bạn có được người dùng vì nếu một ngày nào đó bạn quyết định thay đổi hệ thống quản lý người dùng của mình, như sử dụng một giải pháp khác ngoài Danh tính, sẽ rất đau đớn vì bạn phải xem lại toàn bộ mã của mình.
bạn có thể lấy nó trong bộ điều khiển của bạn:
using System.Security.Claims;
var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
hoặc viết một phương thức mở rộng như trước .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;
}
}
}
và nhận bất cứ nơi nào người dùng ClaimsPrincipal có sẵn :
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))
để lấy số nguyên UserId
Tôi đã sử dụng System.Security.Claims và tôi có thể truy cập phương thức tiện ích mở rộng GetUserId ()
NB: Tôi đã sử dụng Microsoft.AspNet.Identity nhưng không thể có được phương thức mở rộng. Vì vậy, tôi đoán cả hai phải được sử dụng kết hợp với nhau
using Microsoft.AspNet.Identity;
using System.Security.Claims;
EDIT : Câu trả lời này hiện đã lỗi thời. Hãy xem câu trả lời của Soren hoặc Adrien để biết cách đạt được điều này trong CORE 1.0
var userId = User.GetUserId();
Chỉ dành cho .NET Core 2.0 Yêu cầu sau đây để tìm nạp ID người dùng của người dùng đã đăng nhập trong một Controller
lớp:
var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
hoặc là
var userId = HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
ví dụ
contact.OwnerID = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
Như đã nêu ở đâu đó trong bài đăng này, phương thức GetUserId () đã được chuyển sang 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);
}
Nếu bạn đã bắt đầu một dự án trống, bạn có thể cần thêm UserManger vào các dịch vụ của mình trong startup.cs. Nếu không thì đây đã là trường hợp.
bạn phải nhập 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"
cho User.FindFirstValue(ClaimTypes.NameIdentifier);
?
Mặc dù câu trả lời của Adrien là chính xác, bạn có thể làm tất cả trong một dòng. Không cần thêm chức năng hoặc lộn xộn.
Nó hoạt động Tôi đã kiểm tra nó trong ASP.NET Core 1.0
var user = await _userManager.GetUserAsync(HttpContext.User);
sau đó bạn có thể nhận được các thuộc tính khác của biến như thế nào user.Email
. Tôi hi vọng điêu nay se giup được ai đo.
Đối với ASP.NET Core 2.0, Entity Framework Core 2.0, AspNetCore.Identity 2.0 api ( https://github.com/kkagill/ContosoUniversity-Backend ):
Đã Id
được đổi thànhUser.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,
});
}
Phản ứng:
this.User.Identity.Name
có xu hướng là tên người dùng mặc dù. Trong thử nghiệm của tôi, tên người dùng là một email, là người dùng đăng nhập từ đăng ký hoặc đăng nhập từ đăng nhập bên ngoài (ví dụ: Facebook, Google). Mã sau trả về userId. Tôi sử dụng khóa chính tăng tự động cho bảng người dùng nhận dạng của mình, do đó int.Pude. int userId = int.Parse(this.User.FindFirstValue(ClaimTypes.NameIdentifier));
FindByIdAsync
không hoạt động như bạn đang cung cấp một tên người dùng. Nó hoạt động khi bạn thay thế nó bằng FindByNameAsync
.
Người dùng.Identity.GetUserId ();
không tồn tại trong lõi nhận dạng asp.net 2.0. về vấn đề này, tôi đã quản lý theo cách khác nhau. tôi đã tạo một lớp chung để sử dụng toàn bộ ứng dụng, vì nhận được thông tin người dùng.
tạo một lớp chung PCommon & giao diện IPCommon
thêm tài liệu tham khảousing 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();
}
}
Ở đây việc thực hiện lớp học chung
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));
}
}
}
nhận userId và tên trong hành động chèn
_iPCommon.GetUserId();
Cảm ơn, Maksud
Là quản trị viên làm việc trên hồ sơ của người khác và bạn cần lấy Id của hồ sơ bạn đang làm việc, bạn có thể sử dụng ViewBag để chụp Id, ví dụ ViewBag.UserId = userId; trong khi userId là chuỗi Tham số của phương thức bạn đang làm việc.
[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);
}
Nếu bạn muốn điều này trong ASP.NET MVC Controller, hãy sử dụng
using Microsoft.AspNet.Identity;
User.Identity.GetUserId();
Bạn cần thêm using
câu lệnh vì GetUserId()
sẽ không ở đó mà không có nó.
User.GetUserId()
và khôngUser.Identity.GetUserId()
System.Web.HttpContext.Current.User.Identity.Name
?