ฉันเคยทำสิ่งนี้มาแล้วเมื่อใช้ MVC5 User.Identity.GetUserId()
แต่ดูเหมือนจะไม่ทำงานที่นี่ User.Identity
ไม่ได้มีGetUserId()
วิธีการ
ฉันใช้ Microsoft.AspNet.Identity
ฉันเคยทำสิ่งนี้มาแล้วเมื่อใช้ MVC5 User.Identity.GetUserId()
แต่ดูเหมือนจะไม่ทำงานที่นี่ User.Identity
ไม่ได้มีGetUserId()
วิธีการ
ฉันใช้ Microsoft.AspNet.Identity
คำตอบ:
ในตัวควบคุม:
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 :
มันเป็น User.GetUserId () จากSystem.Security.Claims namespace
ตั้งแต่ ASP.NET Core 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))
เพื่อรับจำนวนผู้ใช้
ฉันรวมโดยใช้ System.Security.Claims และฉันสามารถเข้าถึงวิธีการขยาย GetUserId ()
หมายเหตุ: ฉันมีการใช้ Microsoft.AspNet.Identity แล้ว แต่ไม่สามารถรับวิธีการขยายได้ ดังนั้นฉันเดาว่าทั้งคู่ต้องใช้ร่วมกัน
using Microsoft.AspNet.Identity;
using System.Security.Claims;
แก้ไข : คำตอบนี้ล้าสมัยแล้ว ดูคำตอบของโซเรนหรือเอเดรียนสำหรับวิธีลงวันที่เพื่อบรรลุเป้าหมายใน CORE 1.0
var userId = User.GetUserId();
สำหรับ. NET Core 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 มิฉะนั้นจะเกิดกรณีนี้ขึ้น
คุณต้องนำเข้า 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
มันทำงานได้เมื่อคุณเปลี่ยนได้โดย
ใน APiController
User.FindFirst(ClaimTypes.NameIdentifier).Value
อย่างนี้คุณจะได้รับการเรียกร้อง
User.Identity.GetUserId ();
ไม่มีอยู่ใน asp.net identity core 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();
ขอบคุณ Maksud
สำหรับการรับรหัสผู้ใช้ปัจจุบันในมุมมองมีดโกนเราสามารถฉีด UserManager ในมุมมองดังนี้:
@inject Microsoft.AspNetCore.Identity.UserManager<ApplicationUser> _userManager
@{ string userId = _userManager.GetUserId(User); }
ฉันหวังว่าคุณพบว่ามีประโยชน์.
ใช้สามารถใช้
string userid = User.FindFirst("id").Value;
ด้วยเหตุผลบางอย่าง NameIdentifier ตอนนี้ดึงชื่อผู้ใช้ (.net core 2.2)
ในฐานะผู้ดูแลระบบที่ทำงานกับโปรไฟล์ของคนอื่นและคุณต้องได้รับ Id ของโปรไฟล์ที่คุณกำลังทำงานอยู่คุณสามารถใช้ ViewBag เพื่อจับภาพรหัสเช่น 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
?