L'ho già fatto prima con MVC5 User.Identity.GetUserId()
ma non sembra funzionare qui. Non User.Identity
ha il GetUserId()
metodo
sto usando Microsoft.AspNet.Identity
L'ho già fatto prima con MVC5 User.Identity.GetUserId()
ma non sembra funzionare qui. Non User.Identity
ha il GetUserId()
metodo
sto usando Microsoft.AspNet.Identity
Risposte:
Nel controller:
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
}
}
In qualche altra classe:
public class OtherClass
{
private readonly IHttpContextAccessor _httpContextAccessor;
public OtherClass(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void YourMethodName()
{
var userId = _httpContextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
}
}
Quindi dovresti registrarti IHttpContextAccessor
nella Startup
classe come segue:
public void ConfigureServices(IServiceCollection services)
{
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
// Or you can also register as follows
services.AddHttpContextAccessor();
}
Per ulteriori leggibilità, scrivere i metodi di estensione come segue:
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);
}
}
Quindi utilizzare come segue:
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
, potrebbe essere perché l'autenticazione anonima è abilitata. Sono stato in grado di User.Identity.Name
restituire il mio dominio e il mio nome utente espandendo Properties > launchSettings.json
e impostando anonymousAuthentication
su false
e windowsAuthentication
su true
.
Fino a ASP.NET Core 1.0 RC1 :
È User.GetUserId () dallo spazio dei nomi System.Security.Claims .
Da ASP.NET Core 1.0 RC2 :
Ora devi usare UserManager . È possibile creare un metodo per ottenere l'utente corrente:
private Task<ApplicationUser> GetCurrentUserAsync() => _userManager.GetUserAsync(HttpContext.User);
E ottenere informazioni sull'utente con l'oggetto:
var user = await GetCurrentUserAsync();
var userId = user?.Id;
string mail = user?.Email;
Nota:
puoi farlo senza usare un metodo per scrivere singole righe come questa string mail = (await _userManager.GetUserAsync(HttpContext.User))?.Email
, ma non rispetta il principio della singola responsabilità. È meglio isolare il modo in cui ottieni l'utente perché se un giorno deciderai di cambiare il tuo sistema di gestione degli utenti, come utilizzare un'altra soluzione rispetto a Identity, diventerà doloroso dal momento che devi rivedere l'intero codice.
puoi ottenerlo nel tuo controller:
using System.Security.Claims;
var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
o scrivere un metodo di estensione come prima .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;
}
}
}
e ottenere ovunque l'utente ClaimsPrincipal sia disponibile :
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))
per ottenere UserId intero
Ho incluso utilizzando System.Security.Claims e ho potuto accedere al metodo di estensione GetUserId ()
NB: avevo già utilizzato Microsoft.AspNet.Identity ma non riuscivo a ottenere il metodo di estensione. Quindi immagino che entrambi debbano essere usati insieme
using Microsoft.AspNet.Identity;
using System.Security.Claims;
EDIT : questa risposta è obsoleta. Guarda la risposta di Soren o Adrien per un modo datato per raggiungere questo obiettivo in CORE 1.0
var userId = User.GetUserId();
Solo per .NET Core 2.0 Per recuperare l'ID utente dell'utente connesso in una Controller
classe è necessario quanto segue :
var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
o
var userId = HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
per esempio
contact.OwnerID = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
Come indicato da qualche parte in questo post, il metodo GetUserId () è stato spostato nel 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);
}
Se hai avviato un progetto vuoto, potresti dover aggiungere UserManger ai tuoi servizi in startup.cs. Altrimenti questo dovrebbe già essere il caso.
devi importare 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"
per User.FindFirstValue(ClaimTypes.NameIdentifier);
?
Sebbene la risposta di Adrien sia corretta, puoi farlo tutto in una sola riga. Non c'è bisogno di funzioni extra o disordine.
Funziona L'ho controllato in ASP.NET Core 1.0
var user = await _userManager.GetUserAsync(HttpContext.User);
quindi puoi ottenere altre proprietà della variabile come user.Email
. Spero che questo aiuti qualcuno.
Per ASP.NET Core 2.0, Entity Framework Core 2.0, AspNetCore.Identity 2.0 api ( https://github.com/kkagill/ContosoUniversity-Backend ):
È Id
stato modificato inUser.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,
});
}
Risposta:
this.User.Identity.Name
tende ad essere il nome utente però. Nel mio test, il nome utente è un'e-mail, sia l'utente che accede dalla registrazione o accede da un accesso esterno (ad esempio, Facebook, Google). Il codice seguente restituisce userId. Uso una chiave primaria auto-incrementata per la mia tabella utente di identità, da cui int.Parse. int userId = int.Parse(this.User.FindFirstValue(ClaimTypes.NameIdentifier));
FindByIdAsync
non funziona poiché stai fornendo un nome utente. Funziona quando lo si sostituisce con FindByNameAsync
.
User.Identity.GetUserId ();
non esiste in asp.net identity core 2.0. a questo proposito, sono riuscito in modo diverso. ho creato una classe comune per utilizzare l'intera applicazione, a causa dell'ottenimento di informazioni sull'utente.
creare un PCommon di classe comune e interfaccia IPCommon
aggiungendo riferimentousing 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();
}
}
Qui l'implementazione di classe comune
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));
}
}
}
ottenere userId e nome nell'azione insert
_iPCommon.GetUserId();
Grazie, Maksud
Come amministratore che lavora sul profilo di altre persone e devi ottenere l'ID del profilo su cui stai lavorando, puoi utilizzare un ViewBag per acquisire l'ID, ad esempio ViewBag.UserId = userId; mentre userId è il parametro stringa del metodo su cui stai lavorando.
[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);
}
Se lo si desidera nel controller MVC ASP.NET, utilizzare
using Microsoft.AspNet.Identity;
User.Identity.GetUserId();
Devi aggiungere una using
dichiarazione perché GetUserId()
non ci sarebbe senza di essa.
User.GetUserId()
e nonUser.Identity.GetUserId()
System.Web.HttpContext.Current.User.Identity.Name
?