আমি এমভিসি 5 ব্যবহার করে এর আগে এটি করেছি User.Identity.GetUserId()
তবে এখানে কাজ হবে বলে মনে হয় না। User.Identity
স্বল্পতা আছে GetUserId()
পদ্ধতি
আমি ব্যাবহার করছি Microsoft.AspNet.Identity
আমি এমভিসি 5 ব্যবহার করে এর আগে এটি করেছি 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
।
এএসপি.নেট কোর 1.0 টি আরসি 1 অবধি :
এটি সিস্টেম.সিকিউরিটি থেকে ব্যবহারকারী.গেট ইউজারআইডি () ।
যেহেতু এএসপি.নেট কোর 1.0 আরসি 2 :
আপনি এখন ব্যবহার করতে হবে 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);
বা পূর্বের মতো একটি এক্সটেনশন পদ্ধতি লিখুন। কোর ভি 1.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))
পূর্ণসংখ্যার ব্যবহারকারী আইডি পেতে ব্যবহার করতে পারেন
আমি সিস্টেম.সিকিউরিটি.যুক্তি ব্যবহার করে অন্তর্ভুক্ত করেছি এবং আমি getUserId () এক্সটেনশন পদ্ধতিতে অ্যাক্সেস করতে পারি
এনবি: আমার কাছে মাইক্রোসফ্ট.এএসপনেট.আইডেন্টিটি ব্যবহার ছিল কিন্তু এক্সটেনশন পদ্ধতিটি পাইনি। সুতরাং আমি অনুমান করি যে উভয়কেই একে অপরের সাথে মিলিয়ে ব্যবহার করতে হবে
using Microsoft.AspNet.Identity;
using System.Security.Claims;
সম্পাদনা : এই উত্তরটি এখন পুরানো। সিওআর 1.0 এ অর্জনের একটি তারিখের জন্য সোরেনের বা অ্যাড্রিনের উত্তরটি দেখুন
var userId = User.GetUserId();
শুধুমাত্র নেট নেট 2.0 এর জন্য নিম্নলিখিত শ্রেণিতে লগ-ইন করা ব্যবহারকারীর ইউজারআইডি আনতে প্রয়োজনীয় Controller
:
var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
অথবা
var userId = HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
যেমন
contact.OwnerID = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
এই পোস্টে কোথাও বলা হয়েছে, গেট ইউজারআইডি () পদ্ধতিটি ইউজারম্যানেজারে সরানো হয়েছে।
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);
}
আপনি যদি একটি খালি প্রকল্প শুরু করে থাকেন তবে আপনাকে স্টার্টআপ। সিগুলিতে আপনার ব্যবহারকারীর ব্যবহারকারীর ম্যানেজার যুক্ত করতে হবে। অন্যথায় এটি ইতিমধ্যে হওয়া উচিত।
আপনাকে মাইক্রোসফ্ট.এএসপনেটকোর.ইডেন্টিটি এবং সিস্টেম.সিকিউরিটি.ক্লেমস আমদানি করতে হবে
// 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);
?
যদিও অ্যাড্রিনের উত্তরটি সঠিক, আপনি একক লাইনে এগুলি করতে পারেন। অতিরিক্ত ফাংশন বা জগাখিচির দরকার নেই।
এটি কাজ করে আমি এএসপি.নেট কোর 1.0 এ এটি পরীক্ষা করেছিলাম
var user = await _userManager.GetUserAsync(HttpContext.User);
তারপরে আপনি যেমন ভেরিয়েবলের অন্যান্য বৈশিষ্ট্য পেতে পারেন user.Email
। আমি আশা করি এটা কারো সাহায্যে লাগবে.
এএসপি.নেট কোর 2.0, সত্তা ফ্রেমওয়ার্ক কোর 2.0, অ্যাস্পনেটকোর.ইডেন্টিটি 2.0 এপিআই ( https://github.com/kkagill/ContosoUniversity- ব্যাকএন্ড ):
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
যদিও ব্যবহারকারীর নাম হয় না। আমার পরীক্ষায়, ব্যবহারকারীর নামটি একটি ইমেল, নিবন্ধকরণ থেকে ব্যবহারকারী লগ-ইন বা বহিরাগত লগইন (যেমন, ফেসবুক, গুগল) থেকে লগ-ইন হোন। নিম্নলিখিত কোড ব্যবহারকারীর ID প্রদান করে। আমি আমার পরিচয় ব্যবহারকারীর টেবিলের জন্য একটি স্ব-বর্ধিত প্রাথমিক কী ব্যবহার করি, সুতরাং অন্তর্ভুক্ত করুন ars int userId = int.Parse(this.User.FindFirstValue(ClaimTypes.NameIdentifier));
FindByIdAsync
আপনি যেমন একটি ব্যবহারকারীর নাম সরবরাহ করছেন তেমন কাজ করে না। আপনি এটি দ্বারা প্রতিস্থাপন করা হলে এটি কাজ করে FindByNameAsync
।
User.Identity.GetUserId ();
এসপ নেট পরিচয় কোর 2.0 তে বিদ্যমান নেই। এই ক্ষেত্রে, আমি বিভিন্নভাবে পরিচালনা করেছি। ব্যবহারকারীর তথ্য পাওয়ার কারণে আমি পুরো অ্যাপ্লিকেশনটি ব্যবহারের জন্য একটি সাধারণ শ্রেণি তৈরি করেছি।
একটি সাধারণ শ্রেণি তৈরি করুন PCommon & ইন্টারফেস 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));
}
}
}
ব্যবহারকারীর আইডি এবং নাম সন্নিবেশ ক্রিয়ায় পান
_iPCommon.GetUserId();
ধন্যবাদ, মাকসুদ
প্রশাসক হিসাবে অন্য ব্যক্তির প্রোফাইলে কাজ করছেন এবং আপনার যে প্রোফাইলটিতে কাজ করছেন তার আইডি পাওয়া দরকার, আপনি আইডি যেমন ভিউব্যাগ.উউজারআইডি = ইউজারআইডি ক্যাপচার করতে একটি ভিউব্যাগ ব্যবহার করতে পারেন; যখন ইউজারআইডি আপনি কাজ করছেন সেই পদ্ধতির স্ট্রিং প্যারামিটার while
[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);
}
আপনি যদি এএসপি.নেট এমভিসি কন্ট্রোলারে এটি চান তবে ব্যবহার করুন
using Microsoft.AspNet.Identity;
User.Identity.GetUserId();
আপনাকে using
বিবৃতি যুক্ত GetUserId()
করতে হবে কারণ এটি ছাড়া সেখানে থাকবে না।
User.GetUserId()
এবং নয়User.Identity.GetUserId()
System.Web.HttpContext.Current.User.Identity.Name
?