J'ai déjà fait cela avec MVC5 en utilisant User.Identity.GetUserId()
mais cela ne semble pas fonctionner ici . Le User.Identity
n'a pas la méthode GetUserId()
.
J'utilise Microsoft.AspNet.Identity
J'ai inclus à l'aide de System.Security.Claims et j'ai pu accéder à la méthode d'extension GetUserId ()
NB: J'avais déjà utilisé Microsoft.AspNet.Identity mais je n'ai pas pu obtenir la méthode d'extension. Donc, je suppose que les deux doivent être utilisés en conjonction
using Microsoft.AspNet.Identity;
using System.Security.Claims;
EDIT: Cette réponse est maintenant obsolète. Examinez la réponse de Soren ou Adrien pour une méthode dépassée dans CORE 1.0.
Jusqu'à ASP.NET Core 1.0 RC1 :
Il s'agit de User.GetUserId () de l'espace de noms System.Security.Claims.
Depuis ASP.NET Core 1.0 RC2 :
Vous devez maintenant utiliser UserManager . Vous pouvez créer une méthode pour obtenir l'utilisateur actuel:
private Task<ApplicationUser> GetCurrentUserAsync() => _userManager.GetUserAsync(HttpContext.User);
Et obtenez les informations utilisateur avec l'objet:
var user = await GetCurrentUserAsync();
var userId = user?.Id;
string mail = user?.Email;
Remarque: Vous pouvez le faire sans utiliser une méthode d'écriture de lignes simples comme celle-ci string mail = (await _userManager.GetUserAsync(HttpContext.User))?.Email
, mais elle ne respecte pas le principe de responsabilité unique. Il est préférable d'isoler la manière dont vous obtenez l'utilisateur, car si vous décidiez un jour de modifier votre système de gestion des utilisateurs, comme si vous utilisiez une autre solution qu'Identity, la tâche deviendrait pénible, car vous devez revoir l'ensemble de votre code.
vous pouvez l'obtenir dans votre contrôleur:
var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
ou écrit une méthode d’extension identique à celle d’avant .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;
}
}
}
et obtenir partout où l'utilisateur ClaimsPrincipal est disponible:
using Microsoft.AspNetCore.Mvc;
using Shared.Web.MvcExtensions;
namespace Web.Site.Controllers
{
public class HomeController : Controller
{
public IActionResult Index()
{
return Content(this.User.GetUserId());
}
}
}
Dans le contrôleur:
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
}
}
Dans une autre classe:
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);
}
}
Ensuite, vous devriez inscrire IHttpContextAccessor
dans la classe Startup
comme suit:
public void ConfigureServices(IServiceCollection services)
{
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
// Or you can also register as follows
services.AddHttpContextAccessor();
}
Pour .NET Core 2.0 uniquement Les opérations suivantes sont requises pour extraire l'identifiant de l'utilisateur connecté dans une classe Controller
:
var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
ou
var userId = HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
par exemple.
contact.OwnerID = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
Comme indiqué quelque part dans ce post, la méthode GetUserId () a été déplacée vers 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);
}
Si vous avez démarré un projet vide, vous devrez peut-être ajouter le Gestionnaire d’utilisateur à vos services dans startup.cs. Sinon, cela devrait déjà être le cas.
Bien que la réponse d'Adrien soit correcte, vous pouvez le faire en une seule ligne. Pas besoin de fonction supplémentaire ou de gâchis.
Cela fonctionne je l'ai vérifié dans ASP.NET Core 1.0
var user = await _userManager.GetUserAsync(HttpContext.User);
alors vous pouvez obtenir d'autres propriétés de la variable comme user.Email
. J'espère que ça aidera quelqu'un.
Pour ASP.NET Core 2.0, Entity Framework Core 2.0, AspNetCore.Identity 2.0 api ( https://github.com/kkagill/ContosoUniversity-Backend ):
La Id
a été changée en 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,
});
}
Réponse:
vous devez importer 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);
dans la APiController
User.FindFirst(ClaimTypes.NameIdentifier).Value
Quelque chose comme ça, vous aurez les revendications
User.Identity.GetUserId ();
n'existe pas dans le noyau d'identité de asp.net 2.0. à cet égard, j'ai réussi de manière différente. J'ai créé une classe commune pour utiliser toute l'application, en raison de l'obtention d'informations utilisateur.
crée une classe commune PCommon & interface IPCommon ajout de la référence 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();
}
}
Ici l'implémentation de la classe commune
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));
}
}
}
obtenir l'ID utilisateur et le nom dans l'action d'insertion
_iPCommon.GetUserId();
Merci, Maksud
utiliser peut utiliser
string userid = User.FindFirst("id").Value;
pour une raison quelconque, NameIdentifier récupère maintenant le nom d'utilisateur (.net core 2.2)