webentwicklung-frage-antwort-db.com.de

So erhalten Sie die aktuell angemeldete Benutzer-ID in ASP.NET Core

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

95
MRainzo

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

34
MRainzo

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.

87
AdrienTorris

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());
        }
    }
}
61
Soren

Update in ASP.NET Core 2.1 und 2.2:

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();
}
30
TanvirArjel

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);
20
Oracular Man

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.

12
Menno Guldemond

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.

5
Ahmad

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:

 enter image description here

5
jv_

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);
3
Mansur Haider

in der APiController

User.FindFirst(ClaimTypes.NameIdentifier).Value

So etwas bekommen Sie die Ansprüche

2
Usman

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

1
Maksud

verwenden können verwenden 

string userid = User.FindFirst("id").Value;

aus irgendeinem Grund ruft NameIdentifier jetzt den Benutzernamen ab (.net Core 2.2)

0
Mosta