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

ASP.NET Core Razor Pages按钮点击无法触发Logout方法的求助

ASP.NET Core Razor Pages 注销按钮无法触发Logout方法的问题与解决

问题背景

使用ASP.NET Core Razor Pages开发Web应用时,点击页面上的注销按钮,无法触发后端的OnPostLogoutAsync方法,也无法完成用户注销并跳转到登录页。

现有实现代码

Index.cshtml.cs

public class IndexModel : PageModel
{
    public string Username { get; set; }

    public void OnGet()
    {
        if (User.Identity.IsAuthenticated)
        {
            Username = User.Identity.Name;
        }
    }

    public async Task<IActionResult> OnPostLogoutAsync()
    {
        await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
        return RedirectToPage("Login");
    }
}

Index.cshtml

@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

<h1>Welcome</h1>

@if (User.Identity.IsAuthenticated)
{
    <p>Hello, @Model.Username!</p>
    <form method="post" asp-page-handler="Logout">
        <input type="submit" value="Logout" />
    </form>
}

Program.cs

using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages().AddRazorPagesOptions(options =>
{
    options.Conventions.ConfigureFilter(new IgnoreAntiforgeryTokenAttribute());
});

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.LoginPath = "/Login";
        options.ExpireTimeSpan = TimeSpan.FromDays(1);
        options.SlidingExpiration = true;
    });
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();

排查与解决

已确认表单method属性设为post,asp-page-handler属性配置了正确的处理器名称,但查看网络请求后发现请求中没有携带handler=Logout参数,导致后端无法匹配到对应的OnPostLogoutAsync方法。

解决方法1:给表单指定action

在表单中手动添加action="/Index?handler=Logout",确保请求携带处理器参数:

<form method="post" action="/Index?handler=Logout">
    <input type="submit" value="Logout" asp-page-handler="Logout"/>
</form>

解决方法2:给提交按钮添加formaction

如果需要在同一个表单中触发不同的后端方法,可以给提交按钮添加formaction="?handler=Logout":

<form method="post">
    <input type="submit" value="Logout" asp-page-handler="Logout" formaction="?handler=Logout" />
</form>

以上两种方式都能让注销按钮正确触发OnPostLogoutAsync方法,完成用户注销并跳转到登录页。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:54:53