मैंने MVC5 का उपयोग करने से पहले ऐसा किया है, User.Identity.GetUserId()
लेकिन यह यहाँ काम नहीं करता है। User.Identity
नहीं करता है GetUserId()
विधि
मै इस्तेमाल कर रहा हूँ Microsoft.AspNet.Identity
मैंने MVC5 का उपयोग करने से पहले ऐसा किया है, User.Identity.GetUserId()
लेकिन यह यहाँ काम नहीं करता है। User.Identity
नहीं करता है GetUserId()
विधि
मै इस्तेमाल कर रहा हूँ Microsoft.AspNet.Identity
जवाबों:
नियंत्रक में:
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;
}
}
null
।
User.Identity.Name
, तो यह हो सकता है क्योंकि बेनामी प्रमाणीकरण सक्षम है। मैं प्राप्त करने में सक्षम था User.Identity.Name
का विस्तार करके मेरे डोमेन और उपयोगकर्ता नाम वापस जाने के लिए Properties > launchSettings.json
, और स्थापित करने anonymousAuthentication
के लिए false
, और windowsAuthentication
करने के लिए true
।
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
, लेकिन यह एकल जिम्मेदारी सिद्धांत का सम्मान नहीं करता है। उपयोगकर्ता को प्राप्त करने के तरीके को अलग करना बेहतर है क्योंकि यदि किसी दिन आप अपने उपयोगकर्ता प्रबंधन प्रणाली को बदलने का निर्णय लेते हैं, जैसे कि पहचान से दूसरे समाधान का उपयोग करें, तो यह दर्दनाक हो जाएगा क्योंकि आपको अपने पूरे कोड की समीक्षा करनी होगी।
आप इसे अपने नियंत्रक में प्राप्त कर सकते हैं:
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());
}
}
}
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
Convert.ToInt32(User.FindFirstValue(ClaimTypes.NameIdentifier))
पूर्णांक UserId प्राप्त करने के लिए उपयोग कर सकते हैं
मैंने System.Security.Claims का उपयोग करना शामिल किया और मैं GetUserId () एक्सटेंशन विधि का उपयोग कर सका
NB: मैं पहले से ही Microsoft.AspNet.Identity का उपयोग कर रहा था, लेकिन विस्तार विधि नहीं पा सका। इसलिए मुझे लगता है कि दोनों को एक दूसरे के साथ मिलकर उपयोग करना होगा
using Microsoft.AspNet.Identity;
using System.Security.Claims;
EDIT : यह उत्तर अब पुराना हो चुका है। सोरेन 1.0 में इसे प्राप्त करने के दिनांकित तरीके के लिए सोरेन या एड्रियन के उत्तर को देखें
var userId = User.GetUserId();
.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);
जैसा कि इस पोस्ट में कहा गया है, 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 जोड़ने की आवश्यकता हो सकती है। अन्यथा यह मामला पहले से ही होना चाहिए।
आपको 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);
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"
है User.FindFirstValue(ClaimTypes.NameIdentifier);
?
यद्यपि एड्रियन का उत्तर सही है, आप यह सब एक पंक्ति में कर सकते हैं। अतिरिक्त कार्य या गड़बड़ के लिए कोई ज़रूरत नहीं है।
यह काम करता है मैंने इसे ASP.NET Core 1.0 में चेक किया
var user = await _userManager.GetUserAsync(HttpContext.User);
तो आप चर के अन्य गुण प्राप्त कर सकते हैं जैसे user.Email
। मुझे उम्मीद है इससे किसी को सहायता मिलेगी।
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));
FindByIdAsync
काम नहीं करता है क्योंकि आप एक उपयोगकर्ता नाम प्रदान कर रहे हैं। जब आप इसे बदलते हैं तो यह काम करता है FindByNameAsync
।
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();
धन्यवाद, मकसूद
रेजर विचारों में वर्तमान उपयोगकर्ता आईडी प्राप्त करने के लिए, हम इस तरह से दृश्य में UserManager को इंजेक्ट कर सकते हैं:
@inject Microsoft.AspNetCore.Identity.UserManager<ApplicationUser> _userManager
@{ string userId = _userManager.GetUserId(User); }
मुझे उम्मीद है कि आप इसे उपयोगी पाएँ।
अन्य लोगों के प्रोफ़ाइल पर काम करने वाले प्रशासक के रूप में और आपको जिस प्रोफ़ाइल पर काम कर रहे हैं, उसकी आईडी प्राप्त करने की आवश्यकता है, आप 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);
}
यदि आप ASP.NET MVC नियंत्रक में यह चाहते हैं, तो उपयोग करें
using Microsoft.AspNet.Identity;
User.Identity.GetUserId();
आपको using
कथन जोड़ने की आवश्यकता है क्योंकि GetUserId()
इसके बिना नहीं होगा।
User.GetUserId()
और नहींUser.Identity.GetUserId()
System.Web.HttpContext.Current.User.Identity.Name
?