Ich habe dies bereits mit MVC5 mit User.Identity.GetUserId()
gemacht, aber das scheint hier nicht zu funktionieren ... __ Der User.Identity
hat nicht die GetUserId()
-Methode
Ich verwende Microsoft.AspNet.Identity
Ich habe mit System.Security.Claims aufgenommen und konnte auf die Erweiterungsmethode GetUserId () zugreifen
NB: Ich hatte bereits Microsoft.AspNet.Identity verwendet, konnte jedoch die Erweiterungsmethode nicht ermitteln. Ich denke, beide müssen zusammen verwendet werden
using Microsoft.AspNet.Identity;
using System.Security.Claims;
EDIT: Diese Antwort ist jetzt veraltet. Sehen Sie sich die Antwort von Soren oder Adrien an, um in CORE 1.0 einen datierten Weg zu finden
Bis ASP.NET Core 1.0 RC1 :
Es ist User.GetUserId () aus dem System.Security.Claims - Namespace.
Seit ASP.NET Core 1.0 RC2 :
Sie müssen jetzt UserManager ..__ verwenden. Sie können eine Methode erstellen, um den aktuellen Benutzer abzurufen:
private Task<ApplicationUser> GetCurrentUserAsync() => _userManager.GetUserAsync(HttpContext.User);
Und erhalten Sie Benutzerinformationen mit dem Objekt:
var user = await GetCurrentUserAsync();
var userId = user?.Id;
string mail = user?.Email;
Hinweis: Sie können dies tun, ohne eine Methode zu verwenden, die einzelne Zeilen wie string mail = (await _userManager.GetUserAsync(HttpContext.User))?.Email
schreibt, aber das Prinzip der Einzelverantwortung wird nicht beachtet. Es ist besser, die Art und Weise, wie Sie den Benutzer erhalten, zu isolieren. Wenn Sie sich eines Tages dazu entschließen, Ihr Benutzerverwaltungssystem zu ändern, z. B. eine andere Lösung als Identity zu verwenden, wird dies schmerzhaft, da Sie den gesamten Code überprüfen müssen.
Sie können es in Ihrem Controller bekommen:
var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
oder schreibe eine Erweiterungsmethode wie zuvor .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;
}
}
}
und erhalten Sie, wo der Benutzer ClaimsPrincipal verfügbar ist:
using Microsoft.AspNetCore.Mvc;
using Shared.Web.MvcExtensions;
namespace Web.Site.Controllers
{
public class HomeController : Controller
{
public IActionResult Index()
{
return Content(this.User.GetUserId());
}
}
}
In der Steuerung:
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
}
}
In einer anderen Klasse:
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);
}
}
Dann sollten Sie IHttpContextAccessor
wie folgt in der Startup
-Klasse registrieren:
public void ConfigureServices(IServiceCollection services)
{
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
// Or you can also register as follows
services.AddHttpContextAccessor();
}
Nur für .NET Core 2.0 Zum Abrufen der UserID des angemeldeten Benutzers in einer Controller
-Klasse ist Folgendes erforderlich:
var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
oder
var userId = HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
z.B.
contact.OwnerID = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
Wie irgendwo in diesem Beitrag angegeben, wurde die GetUserId () - Methode in den UserManager verschoben.
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);
}
Wenn Sie ein leeres Projekt gestartet haben, müssen Sie möglicherweise den UserManger zu Ihren Diensten in "startup.cs" hinzufügen. Ansonsten sollte dies schon der Fall sein.
Obwohl Adriens Antwort richtig ist, können Sie dies alles in einer Zeile erledigen. Keine zusätzliche Funktion oder Verwirrung.
Es funktioniert, ich habe es in ASP.NET Core 1.0 überprüft
var user = await _userManager.GetUserAsync(HttpContext.User);
dann können Sie andere Eigenschaften der Variablen wie user.Email
erhalten. Ich hoffe das hilft jemandem.
Für ASP.NET Core 2.0, Entity Framework Core 2.0, AspNetCore.Identity 2.0-API ( https://github.com/kkagill/ContosoUniversity-Backend ):
Die Id
wurde in User.Identity.Name
geändert.
[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,
});
}
Antwort:
sie müssen Microsoft.AspNetCore.Identity & System.Security.Claims importieren
// to get current user ID
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
// to get current user info
var user = await _userManager.FindByIdAsync(userId);
in der APiController
User.FindFirst(ClaimTypes.NameIdentifier).Value
So etwas bekommen Sie die Ansprüche
User.Identity.GetUserId ();
ist in asp.net Identity Core 2.0 nicht vorhanden. In dieser Hinsicht habe ich es auf unterschiedliche Weise geschafft. Ich habe eine gemeinsame Klasse für die Verwendung der gesamten Anwendung erstellt, da Benutzerinformationen abgerufen werden.
eine gemeinsame Klasse erstellen PCommon & interface IPCommon Referenz hinzufügen 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();
}
}
Hier die Implementierung der gemeinsamen Klasse
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));
}
}
}
benutzer-ID und Namen in der Einfügeaktion abrufen
_iPCommon.GetUserId();
Danke, Maksud
verwenden können verwenden
string userid = User.FindFirst("id").Value;
aus irgendeinem Grund ruft NameIdentifier jetzt den Benutzernamen ab (.net Core 2.2)