IHttpContextAccessor 中的声明为空

Claims in IHttpContextAccessor are empty

在我的 .net 核心 mvc 应用程序中,我尝试在我的用户服务中获取用户声明。但是声明列表是空的。

public class CurrentUserService : ICurrentUserService
{
    public CurrentUserService(IHttpContextAccessor httpContextAccessor)
    {
        UserId = httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier);
    }
    public string UserId { get; }
}

但页面中有声明。有什么区别?

配置服务:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultUI();

        services.AddHttpContextAccessor();
        services.AddScoped<ICurrentUserService, CurrentUserService>();
        services.AddTransient<IEmailSender, EmailSender>();
        services.Configure<EmailOptions>(options =>
        {
            Configuration.GetSection("Email").Bind(options);
        });
        services.AddPingIdentity(Configuration);
        services.AddApplication();
        services.AddInfrastructure(Configuration);

        services.AddConfiguredRazorPages();
    }

问题在于 CurrentUserService 是在身份验证中间件设置 HttpContext.User 的声明之前由依赖注入框架实例化的。由于 HttpContext.UserCurrentUserService 的构造函数中被访问(使用 IhttpContextAccessor),声明尚不可用。

一个可能的解决方案是在访问 ICurrentUserServiceUserId 属性 时访问 HttpContext.User 属性。

public class CurrentUserService : ICurrentUserService
{
    private readonly IHttpContextAccessor httpContextAccessor;
    public CurrentUserService(IHttpContextAccessor httpContextAccessor)
    {
        this.httpContextAccessor = httpContextAccessor;
    }
    public string UserId => httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier);
}