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

.NET 9.0 Blazor InteractiveAuto中EditForm登录表单提交异常问题

解决.NET 9 Blazor InteractiveAuto模式下静态登录表单的授权矛盾问题

问题背景

使用.NET 9构建Blazor应用,采用InteractiveAuto模式实现交互式组件的同时控制服务器资源占用。静态渲染的登录页提交表单时,先修复了UseAntiforgery()调用顺序错误导致的防伪令牌问题,现在出现逻辑矛盾的授权错误:

info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]
Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.

即未登录用户无法调用登录方法,陷入“需要登录才能登录”的死循环。

核心原因

在InteractiveAuto模式下,Blazor框架会自动为组件中处理表单提交的方法(如AttemptLogin)应用全局授权策略。如果应用全局配置了强制认证规则(比如设置了默认的RequireAuthenticatedUser fallback策略),登录页面的提交方法会被默认要求认证,从而引发矛盾。

解决方案

1. 为登录页面显式允许匿名访问

在Login.razor页面顶部添加@attribute [AllowAnonymous],确保整个登录页面的路由和组件方法都允许匿名访问:

@using System.ComponentModel.DataAnnotations
@using Microsoft.AspNetCore.Identity
@inject NavigationManager navman
@inject SignInManager<AlterFormUser> signin_manager
@inject UserManager<AlterFormUser> user_manager
@page "/login"
@attribute [AllowAnonymous] <!-- 添加此特性 -->

<PageTitle>Login</PageTitle>
<!-- 其余页面内容保持不变 -->

2. 为登录提交方法添加匿名访问特性

在AttemptLogin方法上添加[AllowAnonymous]特性,明确允许未认证用户调用该方法:

@code {
    [SupplyParameterFromForm]
    LoginForm form { get; set; } = new LoginForm();

    [AllowAnonymous] <!-- 添加此特性 -->
    private async Task AttemptLogin()
    {
        var result = await signin_manager.PasswordSignInAsync(form.user_name, form.password, form.remember_me, false);

        if (result.Succeeded)
        {
            navman.NavigateTo("/", forceLoad: true);
        }
        else
        {
            Console.WriteLine("login failure");
        }
    }

    [ExcludeFromInteractiveRouting]
    public class LoginForm
    {
        [Required]
        public string? user_name { get; set; }
        [Required]
        public string? password { get; set; }
        public bool remember_me { get; set; } = false;
    }
}

3. 检查全局授权配置(可选)

如果Program.cs中配置了全局fallback授权策略,需确保登录路由被排除在强制认证规则之外:

builder.Services.AddAuthorization(options =>
{
    options.FallbackPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
});

app.MapRazorComponents<App>()
    .AddInteractiveAutoRenderMode()
    .AddAdditionalAssemblies(typeof(Client._Imports).Assembly);

// 显式指定登录路由允许匿名(可选,确保覆盖全局策略)
app.Map("/login", () => Results.Redirect("/login")).AllowAnonymous();

验证效果

完成以上修改后,静态渲染的登录页提交表单时,AttemptLogin方法会被允许匿名调用,授权错误将不再出现,登录流程可正常执行。

内容的提问来源于stack exchange,提问作者Sunkist

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 07:13:10