Пишу небольшое приложение на .net core, возникла проблема, как правильно прописать новый обьект Claim в аунтификации, что бы обращаться к данным, я переопределил что бы обращаться к имени пользователя, но мне надо добавить еще пароль и электронную почту что бы в последствии добавить админку к пользователю
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Security.Claims;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Project.Models;
namespace RolesApp.Controllers
{
public class AccountController : Controller
{
private ApplicationContext _context;
public AccountController(ApplicationContext context)
{
_context = context;
}
[HttpGet]
public IActionResult Register()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Register(RegisterModel model)
{
if ( ModelState.IsValid)
{
User user = await _context.Users.FirstOrDefaultAsync(u => u.Email == model.Email);
if (user == null)
{
user = new User { Email = model.Email, UserName = model.UserName, Password = model.Password };
Role userRole = await _context.Roles.FirstOrDefaultAsync(r => r.Name == "user");
if (userRole != null)
user.Role = userRole;
_context.Users.Add(user);
await _context.SaveChangesAsync();
await Authenticate(user); // аутентификация
return RedirectToAction("Index", "Home");
}
else
ModelState.AddModelError("", "Некорректные логин/пароль/вы регистрируетесь повторно");
}
return View(model);
}
[HttpGet]
public IActionResult Login()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginModel model)
{
if ( ModelState.IsValid)
{
User user = await _context.Users
.Include(u => u.Role)
.FirstOrDefaultAsync(u => u.Email == model.Email && u.Password == model.Password );
if (user != null)
{
await Authenticate(user); // аутентификация
return RedirectToAction("Index", "Home");
}
ModelState.AddModelError("", "Некорректные логин и(или) пароль");
}
return View(model);
}
private async Task Authenticate(User user)
{
// создаем один claim
var claims = new List<Claim>
{
// new Claim(ClaimsIdentity.DefaultNameClaimType, user.Email),
new Claim(ClaimsIdentity.DefaultRoleClaimType, user.Role?.Name),
new Claim(ClaimsIdentity.DefaultNameClaimType, user.UserName)
};
var Cla = new List<Claim>{
new Claim(ClaimTypes.Actor, user.UserName)
};
// var claimCla = new ClaimsIdentity(Cla);
// создаем объект ClaimsIdentity
ClaimsIdentity id = new ClaimsIdentity(claims, "ApplicationCookie", ClaimsIdentity.DefaultNameClaimType,
ClaimsIdentity.DefaultRoleClaimType);
// установка аутентификационных куки
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(id));
}
}
}