无法使用 IHttpContextAccessor 访问 ASP.NET Core 项目中的当前用户

问题描述 投票:0回答:2

我的 Blazor Web 程序集解决方案 (.NET 6) 的 ASP.NET Core 项目中有一个

UserService
,我在其中尝试访问当前登录的用户以确定他们所在公司的 ID。

用户服务.cs

public class UserService
{
        private readonly UserManager<ApplicationUser> _userManager;
        private readonly IHttpContextAccessor _httpContextAccessor;

        public UserService(UserManager<ApplicationUser> userManager, IHttpContextAccessor httpContextAccessor)
        {
            _userManager = userManager;
            _httpContextAccessor = httpContextAccessor;
        }

        private ClaimsPrincipal User => _httpContextAccessor.HttpContext?.User;

        public IEnumerable<UserDto> GetUsers()
        {
            var users = new List<UserDto>();

            var companyId = GetCompanyId();

            users = _userManager.Users.Select(u => new UserDto()
            {
                CompanyId = u.CompanyId,
                Email = u.Email,
                FirstName = u.FirstName,
                LastName = u.LastName,
                Id = u.Id,
                DeleteDate = u.DeleteDate
            }).Where(u => u.DeleteDate == null && u.CompanyId == companyId.Result).ToList();

            return users;
        }

        public async Task<int> GetCompanyId()
        {
            var user = await _userManager.GetUserAsync(User);
            return user.CompanyId;
        }
}

如您所见,我已将

IHttpContextAccessor
注入到我的
UserService
的构造函数中,并且还在我的
builder.Services.AddHttpContextAccessor();
文件中注册了
Program.cs
(代码也显示在下面)。

每当我的代码到达

return user.CompanyId;
UserService
行时,它就会出现空引用异常错误,因为用户始终为空。当我尝试让它运行此代码时,我已登录并成功通过身份验证。

我是否在

Program.cs
文件中遗漏了某些内容,或者我在
UserService
本身中做错了什么?

程序.cs:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.Configure<IdentityOptions>(options =>
    options.ClaimsIdentity.UserIdClaimType = ClaimTypes.NameIdentifier);
builder.Services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = false)
    .AddRoles<ApplicationRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

builder.Services.AddIdentityServer()
    .AddApiAuthorization<ApplicationUser, ApplicationDbContext>()
    .AddProfileService<ProfileService>();

builder.Services.AddAuthentication()
    .AddIdentityServerJwt();

builder.Services.AddTransient<IUnitOfWork, UnitOfWork>();
builder.Services.AddTransient<UserService>();
builder.Services.AddScoped<DialogService>();

builder.Services.AddControllersWithViews();
builder.Services.AddHttpContextAccessor();
builder.Services.AddRazorPages();

builder.Services.AddServerSideBlazor().AddCircuitOptions(options => { options.DetailedErrors = true; });

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
    app.UseWebAssemblyDebugging();
}
else
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseBlazorFrameworkFiles();
app.UseStaticFiles();

app.UseRouting();

app.UseIdentityServer();
app.UseAuthentication();
app.UseAuthorization();

app.MapRazorPages();
app.MapBlazorHub();
app.MapControllers();
app.MapFallbackToFile("index.html");

app.Run();
c# asp.net-core blazor identity httpcontext
2个回答
0
投票

要使用 contextAccessor 获取 userId,请尝试下面的代码,而不是 usermanager

var userId=_httpContextAccessor.User.Identity.Name

0
投票

我有同样的问题,我无法在我的网站中检索用户。我想知道我是否可以用另一种方式做到这一点。伙计们,你们能帮我解决这个问题吗?预先感谢。

© www.soinside.com 2019 - 2024. All rights reserved.