IHttpContextAccessor中的声明为空

3

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

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

服务

但页面中有声明。它们之间有什么区别?

页面

ConfigureServices:

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

enter image description here


这取决于您在哪里以及如何调用您的服务,是通过Web请求吗? - undefined
我将服务注入到ApplicationDbContext和中介者命令中。在这两种情况下,都没有任何权限要求。 - undefined
你的信息不够,可能是你在 UseMvc 之后调用了 app.UseAuthentication。 - undefined
我已经添加了一个包含我的Configure方法的屏幕截图。 - undefined
1个回答

4
问题在于依赖注入框架在身份验证中间件设置HttpContext.User声明之前实例化了CurrentUserService。由于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);
}

1
哇!感谢Gaste的解释,这在我的情况下非常有效。我没有意识到操作顺序的重要性。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接