Не работает авторизация 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 шт):
Извините, что написал вопрос. Дело оказалось в микроошибке при подключении тэг-хелперов.