繁体   English   中英

ASP.NET Core(MVC):无法进入控制器中的Login HttpPost操作

[英]ASP.NET Core (MVC): Can't get to the Login HttpPost action in controller

我正在尝试实现基本的(而不是粗略的)标识,但是我似乎无法真正在控制器中进行后期操作。

我有一个如下所示的帐户控制器:

[Authorize]
public class AccountController : Controller
{
    private ApplicationDbContext _context;

    public AccountController(ApplicationDbContext context)
    {
        _context = context;
    }

    [HttpGet]
    [AllowAnonymous]
    public IActionResult Login()
    {
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Login(Identity model)
    {
        var t = _context.LoginTable.FirstOrDefault(m => m.UserName == model.UserName);

        if (t == null)
            return View("Signup");

        return View("Index");
    }
}

我的剃刀视图如下所示:

@model MyProject.Models.Identity
@{
    ViewData["Title"] = "Login";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Login</h2>

<form method="post">
    <div class="form-group">
        @Html.LabelFor(m => m.UserName)
        @Html.TextBoxFor(m => m.UserName, new { @class = "form-control" })
    </div>
    <div class="form-group">
        @Html.LabelFor(m => m.Password)
        @Html.TextBoxFor(m => m.Password, new { @class = "form-control", @type = "password" })
    </div>
    <button type="submit" name="login" value="Login">Login</button>
</form>

在我的startup.cs中-中间件是这样的:

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    app.UseAuthentication();

    app.UseStaticFiles(); // serve static files (bootstrap, jQuery, css, etc.) first

    app.UseMvc(ConfigureRoutes);


    app.Run(async (context) =>
    {
        await context.Response.WriteAsync("Hello World!");
    });
}

单击提交按钮时-在调试模式下,我确实单击了GET方法,但未单击POST。

我错过了什么?

编辑:可能正在使用的另一件事是,每次我尝试提交登录表单时,该URL都会添加另一个帐户%... login%...即第一次:

HTTP://本地主机:64191 /帐号/登录RETURNURL =%2F

第二次:

HTTP://本地主机:64191 /帐号/登录RETURNURL =%2FAccount%2FLogin%3FReturnUrl%3D%252F

等等

编辑-是的...我错了[FromBody]

看评论。 原来需要打开授权控制器。 因此,删除控制器上的[Authorize]过滤器可使POST到达该控制器内部的动作。

放置好该过滤器后,POST会点击该过滤器,检查用户是否获得授权,然后在用户到达POST操作之前将其重定向到GET。

很高兴。 将其他答案留在下面(a)以使自己诚实(原始答案是错误的)和(b)万一其他人遇到该常见问题...

原始的[FromBody]答案

尝试在模型前面添加[FromBody],因此mvc知道您要从帖子主体中提取该模型。

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Login([FromBody] Identity model) {
    ... etc ....
}

这对我的开发团队来说是一个非常常见的失误(尤其是从较旧的.net应用转换)。

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Login(Identity model)

在这里,您需要AntiForgeryToken但您未在视图中提供它。 您需要将其添加到表单中。

<form method="post">
    @Html.AntiForgeryToken()
    ...
</form>

您还可以通过向mvc选项添加过滤器来自动进行此操作:

services.AddMvc(options =>
            {
                options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());

            });

您从控制器执行的操作将如下所示:

[HttpPost]
public IActionResult Login(Identity model)

和视图:

<form method="post">
    ...
</form>

HttpGet操作也具有[AllowAnonymous]属性,HttpPost操作也应该具有它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM