.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();
        }