.NET 核心用户声明可重用性
.NET core User Claims Reusability
我使用 Azure B2C 身份验证已有一段时间了。每当我需要识别登录的用户时,我可以调用
User.Claims.FirstOrDefault(e => e.Type == ClaimConstants.ObjectId)?.Value
或者当我需要获取用户的电子邮件时,我可以直接调用
User?.Claims.Where(e => e.Type == "emails").Select(e => e.Value).FirstOrDefault();
一切正常,我可以使用用户的信息,但是我注意到每当我需要获取有关用户的一些信息时,我需要重复自己并一次又一次地使用上面的行。使用控制器中的多个方法,我可能会得到重复的代码。我可以看到 User 来自 ControllerBase,它是一个名为 ClaimsPrincipal 的 class,其中包含我用来识别用户的
private readonly string _userId;
private readonly string _userEmail;
public HomeMickeyMouseController(
IRecaptchaTrashService recaptchaService,
IOrderGarbageService orderService
{
_recaptchaService = recaptchaService;
_orderService = orderService;
_userId = User?.Claims.FirstOrDefault(e => e.Type == ClaimConstants.ObjectId)?.Value;
_userEmail = User?.Claims.Where(e => e.Type == "emails").Select(e => e.Value).FirstOrDefault(); //NULL EVEN AFTER LOGIN??!!! WHILE NOT NULL IN A METHOD?
}
public IActionResult Index()
{
var test = User.Claims.FirstOrDefault(e => e.Type == ClaimConstants.ObjectId)?.Value; //this is not NULL
return View();
}
这有可能以某种方式实现吗,还是我必须在控制器的每个方法中重复 User.Claims?谢谢
您需要使用 HttpContext 在构造函数中获取声明。
private readonly IHttpContextAccessor _context;
//.........
public HomeMickeyMouseController(IHttpContextAccessor context)
{
//.........
_context = context;
var test = _context.HttpContext.User.Claims.Where(e => e.Type == "emails").Select(e => e.Value).FirstOrDefault();
}
我使用 Azure B2C 身份验证已有一段时间了。每当我需要识别登录的用户时,我可以调用
User.Claims.FirstOrDefault(e => e.Type == ClaimConstants.ObjectId)?.Value
或者当我需要获取用户的电子邮件时,我可以直接调用
User?.Claims.Where(e => e.Type == "emails").Select(e => e.Value).FirstOrDefault();
一切正常,我可以使用用户的信息,但是我注意到每当我需要获取有关用户的一些信息时,我需要重复自己并一次又一次地使用上面的行。使用控制器中的多个方法,我可能会得到重复的代码。我可以看到 User 来自 ControllerBase,它是一个名为 ClaimsPrincipal 的 class,其中包含我用来识别用户的 这有可能以某种方式实现吗,还是我必须在控制器的每个方法中重复 User.Claims?谢谢 private readonly string _userId;
private readonly string _userEmail;
public HomeMickeyMouseController(
IRecaptchaTrashService recaptchaService,
IOrderGarbageService orderService
{
_recaptchaService = recaptchaService;
_orderService = orderService;
_userId = User?.Claims.FirstOrDefault(e => e.Type == ClaimConstants.ObjectId)?.Value;
_userEmail = User?.Claims.Where(e => e.Type == "emails").Select(e => e.Value).FirstOrDefault(); //NULL EVEN AFTER LOGIN??!!! WHILE NOT NULL IN A METHOD?
}
public IActionResult Index()
{
var test = User.Claims.FirstOrDefault(e => e.Type == ClaimConstants.ObjectId)?.Value; //this is not NULL
return View();
}
您需要使用 HttpContext 在构造函数中获取声明。
private readonly IHttpContextAccessor _context;
//.........
public HomeMickeyMouseController(IHttpContextAccessor context)
{
//.........
_context = context;
var test = _context.HttpContext.User.Claims.Where(e => e.Type == "emails").Select(e => e.Value).FirstOrDefault();
}