Search code examples
c#asp.net-core-mvcasp.net-identity

Account Login giving HTTP ERROR 400: This page isn’t working in ASP.NET Core MVC


The account login used to work fine, but now it gives error :

This page isn’t working

If the problem continues, contact the site owner.

HTTP ERROR 400

The browser url is https://localhost:7185/Account/Login?returnurl=%2F

The only change from before is I have created a custom _PartialView for my Identity.


Here is my code-

AccountController.cs:

// Login
[HttpGet]
public IActionResult Login(string? returnUrl = null)
{
    LoginAccountViewModel loginViewModel = new LoginAccountViewModel();
    loginViewModel.ReturnUrl = returnUrl ?? Url.Content("~/");
    return View(loginViewModel);
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginAccountViewModel loginViewModel, string returnUrl)
{
    if (ModelState.IsValid)
    {
        var result = await _signInManager.PasswordSignInAsync(loginViewModel.UserName, loginViewModel.Password, loginViewModel.RememberMe, lockoutOnFailure: false);
        if (result.Succeeded)
        {
            return RedirectToAction("Index", "Home");
        }
        else
        {
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            return View(loginViewModel);
        }
    }
    return View(loginViewModel);
}

Edit:

After debugging, I found that the my code could not find the [HttpPost] in my controller hence giving error No resource found. I do not know why this is caused.


Update:

Login.cshtml:

<form asp-controller="Account" asp-action="Login" asp-route-returnurl="@Model.ReturnUrl" method="post" role="form">
    <div class="p-4 p-md-5 border rounded-3 bg-body-tertiary">

        <!-- Right Side -->
        <div class="col-md-5 col-lg-4 order-md-last">
            <!-- OAuth -->
        </div>

        <!-- Left Side -->
        <div class="col-md-7 col-lg-8">
            <h4 class="mb-3">Account Login Details</h4>
            <form class="needs-validation" novalidate="">
                <div class="row g-3">                    

                    <!-- UserName -->
                    <div class="col-12">
                        <label asp-for="UserName" class="form-label">Username</label>
                        <div class="input-group has-validation">
                            <span class="input-group-text">@@</span>
                            <input asp-for="UserName" type="text" class="form-control" id="username" placeholder="Username" required>
                            <div class="invalid-feedback">
                                Your username is required.
                            </div>
                        </div>
                    </div>

                    <!-- Password -->
                    <div class="col-12">
                        <label asp-for="Password" class="form-label">Password</label>
                        <input asp-for="Password" type="password" class="form-control" id="password" placeholder="Password">
                        <div class="invalid-feedback">
                            Please enter atleast 6 characters.
                        </div>
                    </div>
                </div>

                <hr class="my-4">

                <!-- Remember Me -->
                <div class="form-check">
                    <label asp-for="RememberMe">
                        <input asp-for="RememberMe" />
                        @Html.DisplayNameFor(m => m.RememberMe)
                    </label>
                </div>

                <hr class="my-4">

                <!-- Login -->
                <div class="form-group mb-3">
                    <button class="w-100 btn btn-primary btn-lg" type="submit">Login</button>
                </div>

                <hr class="my-4">

                <!-- Register -->
                <p>
                    <a class="mb-5" asp-action="Register">Havent Registered yet?</a>
                </p>
            </form>
        </div>
    </div>
</form>

Page Console: enter image description here

Page Source: enter image description here

No other errors found.


Is there anything I am missing?


Solution

  • The reason why you face the 400 error is you don't set the validation token.

    You should set the @Html.AntiForgeryToken() inside the form tag.

    More details, you could refer to below login view codes:

    <form asp-controller="Account" asp-action="Login" asp-route-returnurl="@Model.ReturnUrl" method="post" role="form">
        <div class="p-4 p-md-5 border rounded-3 bg-body-tertiary">
    
            <!-- Right Side -->
            <div class="col-md-5 col-lg-4 order-md-last">
                <!-- OAuth -->
            </div>
    
            <!-- Left Side -->
            <div class="col-md-7 col-lg-8">
                <h4 class="mb-3">Account Login Details</h4>
                <form class="needs-validation" novalidate="">
                    @Html.AntiForgeryToken()
    
                    <div class="row g-3">
    
                        <!-- UserName -->
                        <div class="col-12">
                            <label asp-for="UserName" class="form-label">Username</label>
                            <div class="input-group has-validation">
                                <span class="input-group-text">@@</span>
                                <input asp-for="UserName" type="text" class="form-control" id="username" placeholder="Username" required>
                                <div class="invalid-feedback">
                                    Your username is required.
                                </div>
                            </div>
                        </div>
    
                        <!-- Password -->
                        <div class="col-12">
                            <label asp-for="Password" class="form-label">Password</label>
                            <input asp-for="Password" type="password" class="form-control" id="password" placeholder="Password">
                            <div class="invalid-feedback">
                                Please enter atleast 6 characters.
                            </div>
                        </div>
                    </div>
    
                    <hr class="my-4">
    
                    <!-- Remember Me -->
                    <div class="form-check">
                        <label asp-for="RememberMe">
                            <input asp-for="RememberMe" />
                            @Html.DisplayNameFor(m => m.RememberMe)
                        </label>
                    </div>
    
                    <hr class="my-4">
    
                    <!-- Login -->
                    <div class="form-group mb-3">
                        <button class="w-100 btn btn-primary btn-lg" type="submit">Login</button>
                    </div>
    
                    <hr class="my-4">
    
                    <!-- Register -->
                    <p>
                        <a class="mb-5" asp-action="Register">Havent Registered yet?</a>
                    </p>
    
                </form>
            </div>
    
        </div>
    
    </form>
    

    Result:

    enter image description here