J'ai un scénario où je dois accéder à User.Identity
Claims dans le contrôleur de mon constructeur.
J'ai besoin de cela car les revendications ont des informations nécessaires pour créer un contexte de base de données personnalisé (chaîne de connexion)
Comment puis-je y accéder? Je voudrais simplement injecter dans le contexte DBC, mais en fonction de l'utilisateur, il peut être nécessaire d'accéder à une base de données différente.
Y a-t-il une meilleure façon de penser à cela?
[Authorize]
public class DefaultController : Controller
{
public DefaultController()
{
// this is NULL
var authenticatedUser = User.Identity.Name;
}
}
A partir de la version 2.1 d'ASP.NET Core, HttpContextAccessor
est fourni. Pour cela, nous devons suivre les étapes suivantes:
Configurez le service à l'aide de l'implémentation standard dans la méthode ConfigureServices
de Startup.cs
:
services.AddHttpContextAccessor();
Effectuez l'injection de dépendance de IHttpContextAccessor
sur les contrôleurs. Utilisez la propriété HttpContext
pour accéder à 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();
}
}
De Rabea AlTaradeh lien ci-dessus:
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();
}
}
Pour accéder aux revendications User.Identity dans le noyau .Net, vous devez utiliser HttpContext. Voici ma mise en œuvre ci-dessous
Premier enregistrement
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
Et puis enregistrez-vous dans la classe Service ou 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;
}
Le détail de la mise en œuvre peut être trouvé ici
S'il vous plaît laissez-moi savoir si vous avez un problème