ASP.NET Core MVC:无法访问控制器中的Login HttpPost方法
先看你给出的代码片段,我发现几个大概率导致问题的地方,一个个来梳理:
1. 控制器级别的[Authorize]限制
你的AccountController类上标注了[Authorize],这意味着所有控制器下的动作方法默认都需要身份验证才能访问。但你的HttpPost Login方法并没有添加[AllowAnonymous]特性——这就陷入了死循环:你本来就是要通过这个方法完成登录,总不能要求用户先登录才能访问登录接口吧?
解决方法:给HttpPost的Login方法补上[AllowAnonymous]:
[HttpPost] [AllowAnonymous] // 必须加这个,允许未授权用户访问登录接口 [ValidateAntiForgeryToken] public IActionResult Login(LoginViewModel model) // 这里假设你有对应的登录视图模型 { // 你的登录逻辑代码 }
2. 方法名拼写/截断问题
你代码里的HttpPost方法写的是Lo...,看起来是内容被截断了,但如果实际代码里是拼写错误(比如写成LogIn、Logn这类),ASP.NET Core的路由系统就找不到对应的动作方法,自然访问不了。
如果是方法名写错了,要么改回Login,要么用[ActionName("Login")]显式指定动作名称:
[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] [ActionName("Login")] // 强制指定动作名为Login,不管方法本身叫什么 public IActionResult YourWrongMethodName(LoginViewModel model) { // ... }
3. 防伪令牌不匹配
你的Post方法加了[ValidateAntiForgeryToken],但如果Login视图里没有生成对应的防伪令牌,提交请求时会被ASP.NET Core直接拒绝。要确保视图里正确添加了防伪令牌:
在Login.cshtml的表单内,用以下方式之一添加:
<!-- 方式1:Html辅助方法 --> @Html.AntiForgeryToken() <!-- 方式2:Tag Helper --> <form asp-action="Login" method="post"> <!-- 其他表单控件 --> <input type="hidden" asp-for="__RequestVerificationToken" /> </form>
4. 路由配置问题
如果你的项目用的是传统路由而非端点路由,要确保路由模板能匹配到Account/Login的Post请求。比如Program.cs(或Startup.cs)里的默认路由配置:
app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); });
这个默认路由是可以正常匹配Account/Login请求的,但如果自定义了特殊路由规则,要检查是否覆盖了这个匹配逻辑。
先从这几个点排查,应该能解决你访问不到Post方法的问题。
内容的提问来源于stack exchange,提问作者Maverick Meerkat

