我的 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();
要使用 contextAccessor 获取 userId,请尝试下面的代码,而不是 usermanager
var userId=_httpContextAccessor.User.Identity.Name
我有同样的问题,我无法在我的网站中检索用户。我想知道我是否可以用另一种方式做到这一点。伙计们,你们能帮我解决这个问题吗?预先感谢。