Ich habe das schon einmal mit MVC5 gemacht, User.Identity.GetUserId()
aber das scheint hier nicht zu funktionieren. Das User.Identity
hat die GetUserId()
Methode nicht
ich benutze Microsoft.AspNet.Identity
Ich habe das schon einmal mit MVC5 gemacht, User.Identity.GetUserId()
aber das scheint hier nicht zu funktionieren. Das User.Identity
hat die GetUserId()
Methode nicht
ich benutze Microsoft.AspNet.Identity
Antworten:
In der Steuerung:
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 einer anderen Klasse:
public class OtherClass
{
private readonly IHttpContextAccessor _httpContextAccessor;
public OtherClass(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void YourMethodName()
{
var userId = _httpContextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
}
}
Dann sollten Sie sich wie folgt IHttpContextAccessor
in der Startup
Klasse anmelden :
public void ConfigureServices(IServiceCollection services)
{
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
// Or you can also register as follows
services.AddHttpContextAccessor();
}
Für eine bessere Lesbarkeit schreiben Sie Erweiterungsmethoden wie folgt:
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);
}
}
Dann verwenden Sie wie folgt:
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
, dies möglicherweise daran liegt, dass die anonyme Authentifizierung aktiviert ist. Ich konnte User.Identity.Name
meine Domain und meinen Benutzernamen durch Erweitern Properties > launchSettings.json
und Einstellen anonymousAuthentication
auf false
und windowsAuthentication
auf zurückgeben true
.
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 zum Schreiben einzelner Zeilen wie diese zu verwenden string mail = (await _userManager.GetUserAsync(HttpContext.User))?.Email
, ohne jedoch das Prinzip der Einzelverantwortung zu berücksichtigen. Es ist besser, die Art und Weise zu isolieren, in der Sie den Benutzer erhalten, da es schmerzhaft wird, wenn Sie eines Tages Ihr Benutzerverwaltungssystem ändern und beispielsweise eine andere Lösung als Identity verwenden, da Sie Ihren gesamten Code überprüfen müssen.
Sie können es in Ihrem Controller erhalten:
using System.Security.Claims;
var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
oder schreiben Sie 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 immer 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());
}
}
}
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
Convert.ToInt32(User.FindFirstValue(ClaimTypes.NameIdentifier))
, um Ganzzahl UserId
Ich habe die Verwendung von System.Security.Claims eingeschlossen und konnte auf die Erweiterungsmethode GetUserId () zugreifen
NB: Ich hatte bereits Microsoft.AspNet.Identity verwendet, konnte aber die Erweiterungsmethode nicht erhalten. Ich denke also, dass beide zusammen verwendet werden müssen
using Microsoft.AspNet.Identity;
using System.Security.Claims;
EDIT : Diese Antwort ist jetzt veraltet. Schauen Sie sich Sorens oder Adriens Antwort an, um zu erfahren, wie dies in CORE 1.0 erreicht werden kann
var userId = User.GetUserId();
Nur für .NET Core 2.0 Zum Abrufen der Benutzer-ID 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. Andernfalls sollte dies bereits der Fall sein.
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);
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"
für User.FindFirstValue(ClaimTypes.NameIdentifier);
?
Obwohl Adriens Antwort richtig ist, können Sie dies alles in einer einzigen Zeile tun. Keine Notwendigkeit für zusätzliche Funktion oder Chaos.
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 erhalten user.Email
. 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 ):
Das Id
wurde geändert 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,
});
}
Antwort:
this.User.Identity.Name
in der Regel der Benutzername. Bei meinem Test ist der Benutzername eine E-Mail, sei es der Benutzer, der sich von der Registrierung aus anmeldet oder sich von einem externen Login anmeldet (z. B. Facebook, Google). Der folgende Code gibt die Benutzer-ID zurück. Ich verwende einen automatisch inkrementierten Primärschlüssel für meine Identitätsbenutzertabelle, daher int.Parse. int userId = int.Parse(this.User.FindFirstValue(ClaimTypes.NameIdentifier));
FindByIdAsync
funktioniert nicht, da Sie einen Benutzernamen angeben. Es funktioniert, wenn Sie es durch ersetzen FindByNameAsync
.
User.Identity.GetUserId ();
existiert nicht in asp.net Identity Core 2.0. In dieser Hinsicht habe ich es anders geschafft. Ich habe eine gemeinsame Klasse für die Verwendung der gesamten Anwendung erstellt, da Benutzerinformationen abgerufen werden.
Erstellen Sie eine gemeinsame Klasse PCommon & Schnittstelle IPCommon
und fügen Sie eine Referenz hinzuusing 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));
}
}
}
Holen Sie sich die Benutzer-ID und den Namen in die Einfügeaktion
_iPCommon.GetUserId();
Danke, Maksud
Als Administrator, der am Profil anderer Personen arbeitet und die ID des Profils abrufen muss, an dem Sie arbeiten, können Sie die ID mit einem ViewBag erfassen, z. B. ViewBag.UserId = userId; während userId der String-Parameter der Methode ist, an der Sie arbeiten.
[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);
}
Wenn Sie dies in ASP.NET MVC Controller möchten, verwenden Sie
using Microsoft.AspNet.Identity;
User.Identity.GetUserId();
Sie müssen eine using
Anweisung hinzufügen , da GetUserId()
diese ohne diese Anweisung nicht verfügbar ist.
User.GetUserId()
und nichtUser.Identity.GetUserId()
System.Web.HttpContext.Current.User.Identity.Name
?