Не работает авторизация asp.net Core.После нажатия кнопки войти остаюсь в том же контроллере

Авторизации в системе не происходит. Меня оставляет на том же контроллере.Взята существующая база данных,через Scaffold-DbContext и мне автоматически по базе создало контекст. Стартовый файл, в котором регистрирую контекст и Cookie-аутентификацию. Startup.cs:

using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace CursachWeb
{
    public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<test_CursachContext>(x=>x.UseSqlServer("Server=DESKTOP-KN71N92\\BD_SQL;Database=test_Cursach;Trusted_Connection=True;"));
            var options = new DbContextOptionsBuilder<test_CursachContext>()
   .UseInMemoryDatabase(databaseName: "test_Cursach");
            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                .AddCookie(options => //CookieAuthenticationOptions
                {
                    options.LoginPath = new Microsoft.AspNetCore.Http.PathString("/Account/Login");
                });
            services.AddControllersWithViews()
                 .SetCompatibilityVersion(CompatibilityVersion.Version_3_0).AddSessionStateTempDataProvider();
        }

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

            app.UseDeveloperExceptionPage();
            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseRouting();
            app.UseAuthentication();    // аутентификация
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                /*endpoints.MapControllerRoute("admin", "{area:exists}/{controller=Home}/{action=Index}/{id?}");*/
                endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}

Модельпредставления в которой пользователь оставляет данные для регистрации. LoginModel.cshtml

 @model CursachWeb.ViewModels.LoginModel
    
    <h2>Вход на сайт</h2>
    
    <a asp-action="Register" asp-controller="Account">Регистрация</a>
    
    <form asp-action="Login" asp-controller="Account" asp-anti-forgery="true">
        <div class="validation" asp-validation-summary="ModelOnly"></div>
        <div>
            <div class="form-group">
                <label asp-for="Login">Введите Login</label>
                <input type="text" asp-for="Login" />
                <span asp-validation-for="Login" />
            </div>
            <div class="form-group">
                <label asp-for="Password">Введите пароль</label>
                <input asp-for="Password" />
                <span asp-validation-for="Password" />
            </div>
            <div class="form-group">
                <input type="submit" value="Войти" class="btn btn-outline-dark" />
            </div>
        </div>
    </form>

класс, который описывает поля МодельПредставления. LoginModel.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;

namespace CursachWeb.ViewModels
{
    public class LoginModel
    {

        [Required(ErrorMessage = "Не указан Login")]
        public string Login { get; set; }

        [Required(ErrorMessage = "Не указан пароль")]
        [DataType(DataType.Password)]
        public string Password { get; set; }
    }
}

АккаунтКонтроллер в котором происходит вход в систему. Логин и пароль полученные из контекста базы сравниваются с теми, которые пришли из МодельПредставления. При правильных данных ->логин пользователя отправляется в аутентификации, затем переадресация в контроллер Home, метод Index. AccountController.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using CursachWeb.ViewModels;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

namespace CursachWeb.Controllers
{
    public class AccountController : Controller
    {
        private test_CursachContext db;
        public AccountController(test_CursachContext context)
        {
            db = context;
        }
        [HttpGet]
        public IActionResult Login()
        {
            return View();
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Login(LoginModel model)
        {
            if (ModelState.IsValid)
            {
                Student user = await db.Students.FirstOrDefaultAsync(u => u.LogIn == model.Login && u.PassWord == model.Password);
                if (user != null)
                {
                    await Authenticate(model.Login); // аутентификация

                    return RedirectToAction("Index", "Home");
                }
                ModelState.AddModelError("", "Некорректные логин и(или) пароль");
            }
            return View(model);
        }
        [HttpGet]
        public IActionResult Register()
        {
            return View();
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Register(RegisterModel model)
        {
            if (ModelState.IsValid)
            {
                User user = await db.Users.FirstOrDefaultAsync(u => u.Email == model.Email);
                if (user == null)
                {
                    // добавляем пользователя в бд
                    db.Users.Add(new User { Email = model.Email, Password = model.Password });
                    await db.SaveChangesAsync();

                    await Authenticate(model.Email); // аутентификация

                    return RedirectToAction("Index", "Home");
                }
                else
                    ModelState.AddModelError("", "Некорректные логин и(или) пароль");
            }
            return View(model);
        }

        private async Task Authenticate(string userName)
        {
            // создаем один claim
            var claims = new List<Claim>
            {
                new Claim(ClaimsIdentity.DefaultNameClaimType, userName)
            };
            // создаем объект ClaimsIdentity
            ClaimsIdentity id = new ClaimsIdentity(claims, "ApplicationCookie", ClaimsIdentity.DefaultNameClaimType, ClaimsIdentity.DefaultRoleClaimType);
            // установка аутентификационных куки
            await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(id));
        }

        public async Task<IActionResult> Logout()
        {
            await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
            return RedirectToAction("Login", "Account");
        }
    }
}

Базовый контроллер, который вызывается при старте, [authorize] завставляет отправить пользователя на авторизацию. HomeController.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace CursachWeb.Controllers
{
    public class HomeController : Controller
        
    {
       
        
        
        [Authorize]
        public IActionResult Index()
        {
            return View(User.Identity.Name);
        }
    }
}

Запускаю проект, меня бросает на хоум контроллер. А так как доступ к методы Index может получить лишь авторизованный пользователь, то далее меня кидает в AccountController на авторизацию(LoginPath в services подключал). Далее у меня вызывается метод Login в AccountController и проверяются данные с ViewModel. Ввожу в поля правильные логин и пароль, но авторизации не происходит и я остаюсь там в Account/Login. Мне кажется , что где-то я неправильный путь указываю и меня зацикливает на входе в систему.Может я неправильно регистрирую Context БД и поэтому не происходит авторизации. База существует, через Scaffold-DbContext Добавил контекст и все сущности. Проблемы может быть 2е: 1) Либо я зациклился между контроллерами и переходами,2)Не работает Cookie аутентификация.


Ответы (1 шт):

Автор решения: Александр Веммон

Извините, что написал вопрос. Дело оказалось в микроошибке при подключении тэг-хелперов.

→ Ссылка