![](/img/trans.png)
[英]ASP.NET Core 2.2 User.Identity has a value in razor but not in controller
[英]ASP.NET Core Access User.Identity in Controller Constructor
我有一個場景,我需要在我的構造函數的控制器中訪問User.Identity
Claims。
我需要這個,因為聲明有我啟動自定義數據庫上下文(連接字符串)所需的信息
我怎樣才能訪問這個? 我只想注入 DBContext,但根據用戶,他們可能需要訪問不同的數據庫。
有沒有更好的方法來考慮這個問題?
[Authorize]
public class DefaultController : Controller
{
public DefaultController()
{
// this is NULL
var authenticatedUser = User.Identity.Name;
}
}
從 ASP.NET Core 2.1 版開始,提供了HttpContextAccessor
。 為此,我們必須遵循以下步驟:
使用Startup.cs
的ConfigureServices
方法中的標准實現配置服務:
services.AddHttpContextAccessor();
在控制器上執行IHttpContextAccessor
的依賴注入。 使用HttpContext
屬性訪問User
[Authorize]
public class DefaultController : Controller
{
public DefaultController(IHttpContextAccessor contextAccessor)
{
// Here HttpContext is not Null :)
var authenticatedUser = contextAccessor.HttpContext.User.Identity.Name;
}
}
This code I using to get the calims
--------
int user_id = 0;
int Account_id = 0;
List<string> roles;
public TEMP_CON_Controller(DatabaseContext context,IHttpContextAccessor,httpContextAccessor)
{
_context = context;
if (httpContextAccessor.HttpContext.User.Identity.IsAuthenticated)
{
var user = httpContextAccessor.HttpContext.User;
this.user_id = int.Parse(user.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value);
IEnumerable<Claim> claims = user.Claims;
var accId = claims.Where(x => x.Type == "AccountId").Select(c => c.Value).SingleOrDefault();
if (!string.IsNullOrEmpty(accId))
this.Account_id = Int32.Parse(accId);
roles = claims.Where(x => x.Type == ClaimTypes.Role).Select(c => c.Value).ToList();
}
}
要訪問 .Net 核心中的 User.Identity Claims,您需要使用 HttpContext。 這是我的以下實現
第一次注冊
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
然后在 Service 或 Controller 類中注冊
private readonly IHttpContextAccessor _httpContextAccessor;
public UserService(
IHttpContextAccessor httpContextAccessor,
IUnitOfWork unitOfWork,
UserManager<User> userManager,
SignInManager<User> signInManager,
RoleManager<ApplicationRole> roleManager)
{
_httpContextAccessor = httpContextAccessor;
_unitOfWork = unitOfWork;
_userManager = userManager;
_signInManager = signInManager;
_roleManager = roleManager;
_currentUserGuid = _httpContextAccessor?.HttpContext?.User?.FindFirst(UserClaimsKey.Sub)?.Value;
_currentUserName = _httpContextAccessor?.HttpContext?.User?.Identity?.Name;
_currentUserEmail = _currentUserGuid == null ? "" : userManager.FindByIdAsync(_currentUserGuid)?.Result?.Email;
}
實現的細節可以在這里找到
如果您有任何問題,請告訴我
來自上面鏈接的 Rabea AlTaradeh:
Startup.cs
//services section
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
[Authorize]
public class HomeController : Controller
{
#region DI
private string UserEmail;
private readonly IHttpContextAccessor _httpContextAccessor;
public HomeController(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
UserEmail = _httpContextAccessor.HttpContext.User.Claims
.FirstOrDefault(c => c.Type == "preferred_username")?.Value;
}
#endregion DI
public IActionResult Index()
{
ViewBag.UserEmail = UserEmail;
return View();
}
}
在 Asp.net Core v.2+ 中,您不必注入 HttpContext 或其他東西。 訪問用戶就像這樣:
public IActionResult GetMe()
{
return Ok(User.Identity.Name);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.