Saya telah melakukan ini sebelumnya dengan menggunakan MVC5 User.Identity.GetUserId()
tetapi sepertinya tidak bekerja di sini. Tidak User.Identity
memiliki GetUserId()
metode
saya menggunakan Microsoft.AspNet.Identity
Saya telah melakukan ini sebelumnya dengan menggunakan MVC5 User.Identity.GetUserId()
tetapi sepertinya tidak bekerja di sini. Tidak User.Identity
memiliki GetUserId()
metode
saya menggunakan Microsoft.AspNet.Identity
Jawaban:
Dalam Kontroler:
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
}
}
Di beberapa kelas lain:
public class OtherClass
{
private readonly IHttpContextAccessor _httpContextAccessor;
public OtherClass(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void YourMethodName()
{
var userId = _httpContextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
}
}
Maka Anda harus mendaftar IHttpContextAccessor
di Startup
kelas sebagai berikut:
public void ConfigureServices(IServiceCollection services)
{
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
// Or you can also register as follows
services.AddHttpContextAccessor();
}
Untuk lebih mudah dibaca, tulis metode ekstensi sebagai berikut:
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);
}
}
Kemudian gunakan sebagai berikut:
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
, itu bisa jadi karena Otentikasi Anonim diaktifkan. Saya dapat User.Identity.Name
mengembalikan domain dan nama pengguna saya dengan memperluas Properties > launchSettings.json
, dan mengatur anonymousAuthentication
ke false
, dan windowsAuthentication
ke true
.
Hingga ASP.NET Core 1.0 RC1 :
Itu adalah User.GetUserId () dari System.Security.Claims namespace.
Sejak ASP.NET Core 1.0 RC2 :
Anda sekarang harus menggunakan UserManager . Anda dapat membuat metode untuk mendapatkan pengguna saat ini:
private Task<ApplicationUser> GetCurrentUserAsync() => _userManager.GetUserAsync(HttpContext.User);
Dan dapatkan informasi pengguna dengan objek:
var user = await GetCurrentUserAsync();
var userId = user?.Id;
string mail = user?.Email;
Catatan:
Anda dapat melakukannya tanpa menggunakan metode penulisan satu baris seperti ini string mail = (await _userManager.GetUserAsync(HttpContext.User))?.Email
, tetapi itu tidak menghormati prinsip tanggung jawab tunggal. Lebih baik mengisolasi cara Anda mendapatkan pengguna karena jika suatu hari Anda memutuskan untuk mengubah sistem manajemen pengguna Anda, seperti menggunakan solusi lain dari Identity, itu akan menyakitkan karena Anda harus meninjau seluruh kode Anda.
Anda bisa mendapatkannya di controller Anda:
using System.Security.Claims;
var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
atau tulis metode ekstensi seperti sebelumnya .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;
}
}
}
dan dapatkan dimanapun Klaim penggunaPrincipal tersedia :
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))
untuk mendapatkan integer UserId
Saya termasuk menggunakan System.Security.Claims dan saya bisa mengakses metode ekstensi GetUserId ()
NB: Saya sudah menggunakan Microsoft.AspNet.Identity tetapi tidak bisa mendapatkan metode ekstensi. Jadi saya kira keduanya harus digunakan bersama satu sama lain
using Microsoft.AspNet.Identity;
using System.Security.Claims;
EDIT : Jawaban ini sudah usang. Lihatlah jawaban Soren atau Adrien untuk mengetahui cara pencapaiannya di CORE 1.0
var userId = User.GetUserId();
Hanya untuk .NET Core 2.0 Berikut ini diperlukan untuk mengambil UserID dari Pengguna yang log in di Controller
kelas:
var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
atau
var userId = HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
misalnya
contact.OwnerID = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
Sebagaimana dinyatakan di suatu tempat dalam posting ini, metode GetUserId () telah dipindahkan ke 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);
}
Jika Anda memulai proyek kosong, Anda mungkin perlu menambahkan UserManger ke layanan Anda di startup.cs. Kalau tidak, ini seharusnya sudah menjadi masalahnya.
Anda harus mengimpor 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"
untuk User.FindFirstValue(ClaimTypes.NameIdentifier);
?
Meskipun jawaban Adrien benar, Anda dapat melakukan ini semua dalam satu baris. Tidak perlu fungsi tambahan atau kekacauan.
Berhasil saya memeriksanya di ASP.NET Core 1.0
var user = await _userManager.GetUserAsync(HttpContext.User);
maka Anda bisa mendapatkan properti lain seperti variabel user.Email
. Saya harap ini membantu seseorang.
Untuk ASP.NET Core 2.0, Entity Framework Core 2.0, AspNetCore.Identity 2.0 api ( https://github.com/kkagill/ContosoUniversity-Backend ):
Itu Id
diubah menjadiUser.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,
});
}
Tanggapan:
this.User.Identity.Name
cenderung menjadi nama pengguna. Pada pengujian saya, nama pengguna adalah email, menjadi pengguna masuk dari pendaftaran atau masuk dari login eksternal (misalnya, Facebook, Google). Kode berikut mengembalikan userId. Saya menggunakan kunci primer yang ditambahkan secara otomatis untuk tabel pengguna identitas saya, karenanya int.Parse. int userId = int.Parse(this.User.FindFirstValue(ClaimTypes.NameIdentifier));
FindByIdAsync
tidak berfungsi karena Anda memberikan nama pengguna. Ini berfungsi saat Anda menggantinya dengan FindByNameAsync
.
User.Identity.GetUserId ();
tidak ada di asp.net identity core 2.0. dalam hal ini, saya telah berhasil dengan cara yang berbeda. Saya telah membuat kelas umum untuk menggunakan seluruh aplikasi, karena mendapatkan informasi pengguna.
buat kelas umum PCommon & antarmuka IPCommon
menambahkan referensiusing 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();
}
}
Di sini implementasi kelas bersama
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));
}
}
}
dapatkan userId dan nama dalam aksi sisipkan
_iPCommon.GetUserId();
Terima kasih, Maksud
Sebagai administrator yang bekerja pada profil orang lain dan Anda perlu mendapatkan ID dari profil yang sedang Anda kerjakan, Anda dapat menggunakan ViewBag untuk menangkap Id misalnya ViewBag.UserId = userId; sementara userId adalah Parameter string dari metode yang sedang Anda kerjakan.
[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);
}
Jika Anda menginginkan ini di ASP.NET MVC Controller, gunakan
using Microsoft.AspNet.Identity;
User.Identity.GetUserId();
Anda perlu menambahkan using
pernyataan karena GetUserId()
tidak akan ada di sana tanpanya.
User.GetUserId()
dan tidakUser.Identity.GetUserId()
System.Web.HttpContext.Current.User.Identity.Name
?