我正在编写一个应用程序 ASP.Net Core (2.2) MVC。我需要根据登录用户的某些声明的值过滤 DbContext 内的一些数据。我注入 IHttpContextAccessor,但是当我尝试访问 HttpContext.User.Identity 时 - 所有属性均为 null,所有声明均为空。
这就是我试图实现连接 IHttpContextAccessor 的方式。我使用这样的标准方法:
public void ConfigureServices(IServiceCollection services){
services.AddHttpContextAccessor();
...
}
然后我构建一个自定义提供程序来从用户中提取声明:
public class GetClaimsFromUser : IGetClaimsProvider
{
public string UserId {get; private set;}
public GetClaimsFromUser(IHttpContextAccessor accessor)
{
UserId = accessor.HttpContext?.User.Claims.SingleOrDefault(x => x.Type == ClaimTypes.Name)?.Value;
}
}
然后我还将它注入到ConfigureServices方法中:
public void ConfigureServices(IServiceCollection services){
...
services.AddScoped<IGetClaimsProvider, GetClaimsFromUser>();
...
}
之后,我将其注入到 ApplicationDbContext 中,并尝试在构造函数中设置私有 _userId 字段:
public class ExpenseManagerDbContext: IdentityDbContext<ApplicationUser>
{
private string _userId;
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, IGetClaimsProvider claimsProvider) : base(options)
{
_userId = claimsProvider.UserId;
...
}
...
}
而这里却是空的。当我访问控制器内的 HttpContext 时,User.Identity 不为空,一切都很好。但是,当我需要在控制器外部访问它时,它是空的。
谢谢你的帮助!!!
完整的代码可以在这里找到: https: //github.com/dudelis/expense-manager/blob/master/ExpenseManager.DataAccess/Concrete/EntityFramework/ExpenseManagerDbContext.cs?
郎朗坤
慕莱坞森
相关分类