You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 05:12:40