ASP.NET Core控制器端点获取当前认证用户返回Null求助
问题:通过Postman调用端点时无法获取当前认证用户信息(用户名和ID返回Null)
尝试获取Web应用的当前认证用户,但通过Postman触发端点时,用户名和ID均返回Null。以下是已尝试的操作:
控制器代码
private readonly IHttpContextAccessor _httpContextAccessor; public AccountController(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } [HttpGet] public async Task<ActionResult<User>> GetUser() { string? username = _httpContextAccessor.HttpContext?.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value; var id = _httpContextAccessor.HttpContext?.User.FindFirst(ClaimTypes.NameIdentifier)?.Value; var user = await _userManager.Users.FirstOrDefaultAsync(o => o.Id == id); return Ok(user); }
扩展方法尝试
public static class ClaimsPrincipalExtension { public static string GetUsername(this ClaimsPrincipal user) { return user.FindFirst(ClaimTypes.Name)?.Value; } public static string GetUserId(this ClaimsPrincipal user) { return user.FindFirst(ClaimTypes.NameIdentifier)?.Value; } }
Program.cs配置
// Add services to the container. builder.Services.AddRazorPages(); builder.Services.AddIdentityServices(builder.Configuration); builder.Services.AddApplicationServices(builder.Configuration); //Handling json: builder.Services.AddControllers() .AddNewtonsoftJson(options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore ); builder.Services.Configure<IdentityOptions>(options => options.ClaimsIdentity.UserIdClaimType = ClaimTypes.NameIdentifier); builder.Services.AddHttpContextAccessor(); builder.Services.ConfigureApplicationCookie(options => { options.Events.OnRedirectToAccessDenied = options.Events.OnRedirectToLogin = context => { if (context.Request.Method != "GET") { context.Response.StatusCode = StatusCodes.Status401Unauthorized; return Task.FromResult<object>(null); } context.Response.Redirect(context.RedirectUri); return Task.FromResult<object>(null); }; }); var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { 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.UseCors(builder => { builder.WithOrigins("https://localhost:4200") .AllowCredentials() .AllowAnyMethod() .AllowAnyHeader(); }); app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); app.Run();
Identity和Application扩展类
public static class ApplicationExtensions { public static IServiceCollection AddApplicationServices(this IServiceCollection services, IConfiguration config) { services.AddDbContext<DataContext>(opt => { object value = opt.UseSqlServer(config.GetConnectionString("DefaultConnection")); opt.EnableSensitiveDataLogging(); }); services.AddCors(); services.AddScoped<ITokenService, TokenService>(); services.AddHttpContextAccessor(); services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); services.AddScoped<LogUserActivity>(); services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); return services; } } public static class IdentityExtensions { public static IServiceCollection AddIdentityServices(this IServiceCollection services, IConfiguration config) { services.AddIdentity<User, IdentityRole>( opt => { opt.Password.RequireDigit = true; opt.Password.RequireLowercase = true; opt.Password.RequireNonAlphanumeric = true; opt.Password.RequireUppercase = true; opt.Password.RequiredLength = 4; opt.User.RequireUniqueEmail = true; } ).AddEntityFrameworkStores<DataContext>(); services.AddLogging(); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddNegotiate() .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config["Token:Key"])), ValidIssuer = config["Token:Issuer"], ValidateIssuer = false, ValidateAudience = false }; options.Events = new JwtBearerEvents { OnMessageReceived = context => { var accessToken = context.Request.Query["access_token"]; var path = context.HttpContext.Request.Path; if (!string.IsNullOrEmpty(accessToken) && path.StartsWithSegments("/hubs")) { context.Token = accessToken; } return Task.CompletedTask; }, }; }); services.ConfigureApplicationCookie(options => { options.AccessDeniedPath = "/user/access_denied"; options.Cookie.Name = "leo-coin"; options.Cookie.HttpOnly = true; options.ExpireTimeSpan = TimeSpan.FromMinutes(60); options.LoginPath = "/user/login"; options.ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter; options.SlidingExpiration = true; }); return services; } }
内容的提问来源于stack exchange,提问作者user17205196
相关产品推荐
相关产品推荐

