ASP.NET Core में यूजर आईडी में करंट लॉग इन कैसे करें


179

मैंने MVC5 का उपयोग करने से पहले ऐसा किया है, User.Identity.GetUserId()लेकिन यह यहाँ काम नहीं करता है। User.Identityनहीं करता है GetUserId()विधि

मै इस्तेमाल कर रहा हूँ Microsoft.AspNet.Identity


2
यह कोशिश करो System.Web.HttpContext.Current.User.Identity.Name?
प्रवीण देशमुख

धन्यवाद @PravinDeshmukh लेकिन वह उपयोगकर्ता का नाम लौटाता है न कि id
MRainzo

1
यह काम करना चाहिए। Asp.net github.com/aspnet/Identity/blob/… में नमूने देखें । बस सुनिश्चित करें कि उपयोगकर्ता लॉग इन है। @PravinDeshmukh, कभी भी System.Web.HttpContext.Current का प्रयोग vnext में न करें :)
user960567

1
Hi @ user960567, क्या आप हमें बता सकते हैं कि क्यों?
प्रवीण देशमुख

@PravinDeshmukh क्योंकि यह .NET कोर पर काम नहीं करेगा और कोई System.Web निर्भरता नहीं है।
user960567

जवाबों:


148

ASP.NET कोर वर्जन> = 2.0 में अपडेट करें

नियंत्रक में:

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
    }
}

किसी अन्य वर्ग में:

public class OtherClass
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    public OtherClass(IHttpContextAccessor httpContextAccessor)
    {
       _httpContextAccessor = httpContextAccessor;
    }

   public void YourMethodName()
   {
      var userId = _httpContextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
   }
}

फिर आपको निम्नानुसार कक्षा IHttpContextAccessorमें पंजीकरण करना चाहिए Startup:

public void ConfigureServices(IServiceCollection services)
{
    services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

    // Or you can also register as follows

    services.AddHttpContextAccessor();
}

अधिक पठनीयता के लिए विस्तार के तरीके इस प्रकार लिखें:

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);
    }
}

फिर निम्नानुसार उपयोग करें:

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;
     }
}

1
लेकिन उपयोगकर्ता मेरे मामले में अशक्त लौट रहा है? मैं कहाँ गलत कर रहा हूँ?
श्रुति वर्गीज '

क्या आप वाकई किसी उपयोगकर्ता के साथ लॉग इन हैं?
तनवीरअर्जेल

मेरा परिदृश्य ऐसा है जैसे मैं चाहता हूं कि मेरे उपयोगकर्ता का उपयोगकर्ता नाम मेरे सिस्टम में लॉग इन हो। इसे उबंटू या विंडोज होने दें? और जैसा कि मैं इसका परीक्षण कर रहा हूँ खिड़कियों में मैं अपने नाम के तहत लॉग इन हूँ। लेकिन लौट रहा है null
श्रुति वर्गीस '’

फिर अपना कोड देखना होगा! यहां कोई भी बाहरी एजेंट भूमिका निभा सकता है।
तनवीरअर्जेल

2
मैंने पाया है कि यदि आपको एक अशक्त परिणाम मिला है User.Identity.Name, तो यह हो सकता है क्योंकि बेनामी प्रमाणीकरण सक्षम है। मैं प्राप्त करने में सक्षम था User.Identity.Nameका विस्तार करके मेरे डोमेन और उपयोगकर्ता नाम वापस जाने के लिए Properties > launchSettings.json, और स्थापित करने anonymousAuthenticationके लिए false, और windowsAuthenticationकरने के लिए true
एंड्रयू ग्रे

109

ASP.NET कोर 1.0 RC1 तक :

यह User.GetUserId () System.Security.Claims नामस्थान से है।

ASP.NET कोर 1.0 RC2 के बाद से :

अब आपको UserManager का उपयोग करना होगा । आप वर्तमान उपयोगकर्ता प्राप्त करने के लिए एक विधि बना सकते हैं:

private Task<ApplicationUser> GetCurrentUserAsync() => _userManager.GetUserAsync(HttpContext.User);

और ऑब्जेक्ट के साथ उपयोगकर्ता जानकारी प्राप्त करें:

var user = await GetCurrentUserAsync();

var userId = user?.Id;
string mail = user?.Email;

नोट: आप इस तरह से एकल लाइनों को लिखने वाली एक विधि का उपयोग किए बिना कर सकते हैं string mail = (await _userManager.GetUserAsync(HttpContext.User))?.Email, लेकिन यह एकल जिम्मेदारी सिद्धांत का सम्मान नहीं करता है। उपयोगकर्ता को प्राप्त करने के तरीके को अलग करना बेहतर है क्योंकि यदि किसी दिन आप अपने उपयोगकर्ता प्रबंधन प्रणाली को बदलने का निर्णय लेते हैं, जैसे कि पहचान से दूसरे समाधान का उपयोग करें, तो यह दर्दनाक हो जाएगा क्योंकि आपको अपने पूरे कोड की समीक्षा करनी होगी।


1
मेरे पास System.Security.Claims नाम स्थान और Microsoft.AspNet.Identity असेंबली है।
scottheckel

2
मुझे लगता है कि यह जवाब स्वीकार किए गए जवाब से बेहतर है क्योंकि विशेष रूप से asp.net कोर निर्भरता इंजेक्शन को बढ़ावा दे रहा है।
फिलिप डेविस

2
गलत तरीके से लगता है क्योंकि उपयोगकर्ता प्रबंधक उपयोगकर्ता के बारे में जानकारी प्राप्त करने के लिए डेटाबेस में अनुरोध करेगा। और इस मामले में userId पहले से ही HttpContext.User
incognito

@incognito पहचानकर्ता सिर्फ एक उदाहरण था लेकिन आप उपयोगकर्ता की वस्तु के साथ सभी आवश्यक जानकारी प्राप्त कर सकते हैं
AdrienTorris

2
@ एड्रियन लेकिन सवाल यह था कि उपयोगकर्ता आईडी कैसे प्राप्त करें। केवल यह कहना चाहता था कि प्रदान किया गया तरीका सबसे अधिक कुशल नहीं है। इस मामले के लिए मैं सोरेन या छोटे संस्करण द्वारा उत्तर देना पसंद करूंगा जो टिप्पणियों में पाया जा सकता है।
गुप्त

91

आप इसे अपने नियंत्रक में प्राप्त कर सकते हैं:

using System.Security.Claims;
var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);

या पहले की तरह एक विस्तार विधि लिखें। कोर 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;
        }
    }
}

और जहां भी उपयोगकर्ता का दावा हो, उसे प्राप्त करें :

using Microsoft.AspNetCore.Mvc;
using Shared.Web.MvcExtensions;

namespace Web.Site.Controllers
{
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return Content(this.User.GetUserId());
        }
    }
}

16
छोटा संस्करण:var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
CFreitas

1
ध्यान दें कि यह एक्सटेंशन विधि केवल उपयोगकर्ता के लिए नियंत्रकों के अंदर काम करती है, न कि घटकों को देखने के लिए, जैसा कि दृश्य घटक उपयोगकर्ता IPrincipal का है
adam3039

@ आप Convert.ToInt32(User.FindFirstValue(ClaimTypes.NameIdentifier))पूर्णांक UserId प्राप्त करने के लिए उपयोग कर सकते हैं
हमजा खानजादा

1
@ HamzaKhanzada हां, यह काम करता है, लेकिन इतना लंबा और बदसूरत दिखता है।
एके

39

मैंने System.Security.Claims का उपयोग करना शामिल किया और मैं GetUserId () एक्सटेंशन विधि का उपयोग कर सका

NB: मैं पहले से ही Microsoft.AspNet.Identity का उपयोग कर रहा था, लेकिन विस्तार विधि नहीं पा सका। इसलिए मुझे लगता है कि दोनों को एक दूसरे के साथ मिलकर उपयोग करना होगा

using Microsoft.AspNet.Identity;
using System.Security.Claims;

EDIT : यह उत्तर अब पुराना हो चुका है। सोरेन 1.0 में इसे प्राप्त करने के दिनांकित तरीके के लिए सोरेन या एड्रियन के उत्तर को देखें


17
यह गुप्त चटनी थी, लेकिन किसी के लिए भी आप इन चीजों को जोड़ने के बाद देखते हैं ... var userId = User.GetUserId();
समुराई केन

4
.GetUserId () ClaimsPrincipal (नियंत्रक.User) से एक्सटेंशन => UserManager.GetUserId (उपयोगकर्ता) में स्थानांतरित कर दिया गया है;
सोरेन

1
System.Security.Claims का उपयोग करना; var userId = this.User.FindFirst (ClaimTypes.NameIdentifier);
स्विच करें

3
पहले मान्य उत्तर के लिए अंगूठे, और नए "सही" उत्तर की सही पहचान।
pimbrouwers

26

.NET कोर 2.0 के लिए केवल एक Controllerवर्ग में लॉग-इन उपयोगकर्ता के UserID लाने के लिए निम्नलिखित आवश्यक है :

var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);

या

var userId = HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);

जैसे

contact.OwnerID = this.User.FindFirstValue(ClaimTypes.NameIdentifier);

17

जैसा कि इस पोस्ट में कहा गया है, GetUserId () विधि को 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);
}

यदि आपने एक खाली प्रोजेक्ट शुरू किया है, तो आपको स्टार्टअप में अपनी सेवाओं में UserManger जोड़ने की आवश्यकता हो सकती है। अन्यथा यह मामला पहले से ही होना चाहिए।


10

आपको 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);

यह सब आपके awsers से ही है जो ASP.NET CORE v 2.0 के साथ काम करता है। Congratz!
जस्ट फेयर

यह बात है। .NET कोर 2.0 और इसके बाद के संस्करण से कोई भी, यह आपका उत्तर है
alvinchesaro

1
एक वेब एपीआई + JWT सेटिंग में .NET कोर 3.1 पर परीक्षण किया गया। मैं वर्तमान में एक आधार नियंत्रक में उपयोगकर्ता में हस्ताक्षरित करना चाहता हूं, यह कुशल नहीं है, हर अनुरोध के लिए डेटाबेस से उपयोगकर्ता को क्वेरी करना, आदि क्या डेटाबेस को क्वेरी किए बिना वर्तमान उपयोगकर्ता को प्राप्त करने का कोई तरीका है?
नेक्सस

मेरा क्यों लौटता "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"है User.FindFirstValue(ClaimTypes.NameIdentifier);?
प्यूरिले

5

यद्यपि एड्रियन का उत्तर सही है, आप यह सब एक पंक्ति में कर सकते हैं। अतिरिक्त कार्य या गड़बड़ के लिए कोई ज़रूरत नहीं है।

यह काम करता है मैंने इसे ASP.NET Core 1.0 में चेक किया

var user = await _userManager.GetUserAsync(HttpContext.User);

तो आप चर के अन्य गुण प्राप्त कर सकते हैं जैसे user.Email। मुझे उम्मीद है इससे किसी को सहायता मिलेगी।


3
कारण यह है कि मैं एक विधि का उपयोग कर रहा हूं, एकल जिम्मेदारी सिद्धांत का सम्मान करना है। यदि आप उपयोगकर्ता को प्राप्त करने के तरीके को अलग नहीं करते हैं, तो यह दर्दनाक होगा यदि किसी दिन आप उपयोगकर्ता प्रबंधन प्रणाली को संशोधित करने का निर्णय लेते हैं, जैसे कि पहचान से दूसरे समाधान का उपयोग करें।
AdrienTorris

5

ASP.NET कोर 2.0 के लिए, एंटिटी फ्रेमवर्क कोर 2.0, AspNetCore.Identity 2.0 एपीआई ( https://github.com/kkagill/ContosoUniversity-Backend ) के लिए:

Idमें बदल गया था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,
        });
    }

उत्तर:

यहां छवि विवरण दर्ज करें


मेरे परीक्षण के आधार पर, this.User.Identity.Nameहालांकि उपयोगकर्ता नाम हो जाता है। मेरे परीक्षण पर, उपयोगकर्ता नाम एक ईमेल है, पंजीकरण या लॉग-इन से बाहरी लॉगिन (जैसे, फेसबुक, Google) में उपयोगकर्ता लॉग-इन करें। निम्नलिखित कोड userId देता है। मैं अपनी पहचान उपयोगकर्ता तालिका के लिए एक ऑटो-इन्क्रिम्ड प्राइमरी कुंजी का उपयोग करता हूं, इसलिए int.Parse। int userId = int.Parse(this.User.FindFirstValue(ClaimTypes.NameIdentifier));
माइकल ब्यून

1
FindByIdAsyncकाम नहीं करता है क्योंकि आप एक उपयोगकर्ता नाम प्रदान कर रहे हैं। जब आप इसे बदलते हैं तो यह काम करता है FindByNameAsync
जैस्पर

4

में APiController

User.FindFirst(ClaimTypes.NameIdentifier).Value

कुछ इस तरह से आपको दावे मिलेंगे


1

User.Identity.GetUserId ();

asp.net पहचान कोर 2.0 में मौजूद नहीं है। इस संबंध में, मैंने अलग तरीके से काम किया है। उपयोगकर्ता जानकारी प्राप्त करने के कारण, मैंने संपूर्ण एप्लिकेशन के उपयोग के लिए एक सामान्य वर्ग बनाया है।

संदर्भ बनाने के लिए एक सामान्य वर्ग PCOMON और इंटरफ़ेस IPCommon बनाएँ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();        
    }    
}

यहाँ सामान्य वर्ग का कार्यान्वयन

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));
        }



    }
}

सम्मिलित क्रिया में userId और नाम प्राप्त करें

_iPCommon.GetUserId();

धन्यवाद, मकसूद


1
क्या आपको Startup.cs में IHttpContextAccessor पंजीकृत करना होगा?
REMESQ

1
कोई REMESQ, मैंने इसे स्टार्टअप में इंजेक्ट नहीं किया है, लेकिन मेरे आवेदन में काम कर रहा है
मक्सूद

1

रेजर विचारों में वर्तमान उपयोगकर्ता आईडी प्राप्त करने के लिए, हम इस तरह से दृश्य में UserManager को इंजेक्ट कर सकते हैं:

@inject Microsoft.AspNetCore.Identity.UserManager<ApplicationUser> _userManager
@{ string userId = _userManager.GetUserId(User); }

मुझे उम्मीद है कि आप इसे उपयोगी पाएँ।


0

उपयोग कर सकते हैं

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

किसी कारण से NameIdentifier अब उपयोगकर्ता नाम (.net core 2.2) को पुनः प्राप्त करता है


0

अन्य लोगों के प्रोफ़ाइल पर काम करने वाले प्रशासक के रूप में और आपको जिस प्रोफ़ाइल पर काम कर रहे हैं, उसकी आईडी प्राप्त करने की आवश्यकता है, आप Id जैसे ViewBag.UserId = userId को कैप्चर करने के लिए ViewBag का उपयोग कर सकते हैं; जबकि userId उस पद्धति का स्ट्रिंग पैरामीटर है जिस पर आप काम कर रहे हैं।

    [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);
    }

-11

यदि आप ASP.NET MVC नियंत्रक में यह चाहते हैं, तो उपयोग करें

using Microsoft.AspNet.Identity;

User.Identity.GetUserId();

आपको usingकथन जोड़ने की आवश्यकता है क्योंकि GetUserId()इसके बिना नहीं होगा।


2
हाँ, मैं इस सवाल में शामिल था कि मेरे पास "Microsoft.AspNet.Identity का उपयोग करना" है। मैंने सोचा कि इसे कैसे हल किया जाए, हालांकि पोस्ट पर मेरे उत्तर के साथ
MRainzo

1
FWIW यह (अब) है User.GetUserId()और नहींUser.Identity.GetUserId()
lc है।

18
सवाल यह था और abou asp.net CORE है जिसमें नामस्थान Microsoft.AspNetCore.Identity है; और Microsoft.AspNet.Identity नहीं; और उस नए नामस्थान का उपयोग करते हुए NO GetUserId () एक्सटेंशन विधि है। इस उत्तर गलत है!
पास्कल

4
सभी कैप पर आसान। और SO पर अच्छा होने के बारे में जानें। stackoverflow.blog/2018/04/26/…
smoore4
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.