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
相关产品推荐
相关产品推荐

