Blazor .NET 8 ApiController调用返回登录重定向HTML,未使用Header认证
解决Blazor .NET 8 Server Side API基础认证重定向问题
你的问题核心是两个点:API端点映射顺序导致请求被Blazor路由拦截,以及未启用基础认证方案,Identity默认将未认证请求重定向到登录页。以下是具体解决步骤:
1. 启用基础认证
IdentityCore默认不包含基础认证,需要手动添加该认证方案并配置验证逻辑:
- 先安装NuGet包:
Microsoft.AspNetCore.Authentication.Basic - 在
AddIdentityCore之后添加基础认证服务:
builder.Services.AddAuthentication() .AddBasicAuth(options => { options.Events = new BasicAuthenticationEvents { OnValidateCredentials = async context => { var userManager = context.HttpContext.RequestServices.GetRequiredService<UserManager<IdentityUser>>(); var user = await userManager.FindByNameAsync(context.UserName); if (user != null && await userManager.CheckPasswordAsync(user, context.Password)) { var claims = await userManager.GetClaimsAsync(user); var identity = new ClaimsIdentity(claims, BasicAuthenticationDefaults.AuthenticationScheme); context.Principal = new ClaimsPrincipal(identity); context.Success(); } } }; });
2. 调整中间件与端点顺序
中间件和端点的顺序直接影响请求处理流程,必须按以下顺序配置:
- 先启用
UseAuthentication()和UseAuthorization(),确保认证授权逻辑优先执行 - 将
MapControllers()移到MapRazorComponents之前,让API请求优先被处理,避免被Blazor的交互式服务端路由拦截 - 配置授权策略,让API请求未认证时返回401(而非重定向到登录页)
修改后的关键代码片段:
var app = builder.Build(); app.UseHttpsRedirection(); // 认证、授权中间件必须在静态文件、Antiforgery之前 app.UseAuthentication(); app.UseAuthorization(); app.UseStaticFiles(); app.UseAntiforgery(); // 先映射API控制器,确保API请求优先匹配 app.MapControllers(); // 再映射Blazor组件 app.MapRazorComponents<App>() .AddInteractiveServerRenderMode(); app.MapAdditionalIdentityEndpoints(); app.Run();
3. 为API控制器指定认证方案
在你的ApiController类或方法上显式指定使用基础认证方案,避免和Blazor的Cookie认证冲突:
[ApiController] [Route("api/[controller]")] [Authorize(AuthenticationSchemes = BasicAuthenticationDefaults.AuthenticationScheme)] public class MyApiController : ControllerBase { [HttpGet] public IActionResult GetData() { return Ok("已通过基础认证"); } }
完成以上修改后,用Postman调用API时,携带基础认证头就能正常通过验证,未认证请求会返回401状态码,而非登录页HTML。
内容的提问来源于stack exchange,提问作者DataWrangler1980
相关产品推荐
相关产品推荐

