ASP.NET Core (MVC): не удается перейти к действию HttpPost для входа в систему в контроллере - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь реализовать базовую (и довольно грубую) идентификацию, но мне кажется, что я никак не могу добраться до действия post в моем контроллере.

У меня есть контроллер аккаунта, который выглядит так:

[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% ... т.е. 1-й раз:

http://localhost:64191/Account/Login?ReturnUrl=%2F

2-й раз:

http://localhost:64191/Account/Login?ReturnUrl=%2FAccount%2FLogin%3FReturnUrl%3D%252F

и т.д.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018
[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 он тоже должен быть.

0 голосов
/ 28 апреля 2018

Редактировать - Да ... Я был неправ насчет [FromBody]

Смотрите комментарии. Оказывается, контроллер авторизации должен быть открыт. Таким образом, удаление фильтра [Authorize] на контроллере позволяет POST достичь действия внутри этого контроллера.

Когда этот фильтр был на месте, POST запускает этот фильтр, проверяет, авторизован ли пользователь, а затем перенаправляет их в GET, прежде чем пользователь когда-либо достигнет действия POST.

Рад, что сработало. Оставьте другой ответ ниже (а), чтобы сохранить честность (первоначальный ответ был неправильным) и (б) в случае, если кто-то столкнется с этой общей проблемой ...

Оригинальный ответ [FromBody]

Попробуйте добавить [FromBody] перед моделью, чтобы mvc знал, что вы хотите извлечь эту модель из тела сообщения.

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

Это действительно распространенная ошибка в моей команде разработчиков (особенно при конвертации из старых приложений .net).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...