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.User
在 CurrentUserService
的构造函数中被访问(使用 IhttpContextAccessor
),声明尚不可用。
一个可能的解决方案是在访问 ICurrentUserService
的 UserId
属性 时访问 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);
}
在我的 .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.User
在 CurrentUserService
的构造函数中被访问(使用 IhttpContextAccessor
),声明尚不可用。
一个可能的解决方案是在访问 ICurrentUserService
的 UserId
属性 时访问 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);
}