Делаю чат, cтолкнулся с проблемой вывода Ника пользователя, после изменения базы данных, не знаю как обратится к каким либо полям пользователя которые я указываю при регистрации
Moй хаб:
using System.Threading.Tasks;
using Microsoft.AspNetCore.SignalR;
namespace Project
{
public class ChatHub : Hub
{
public async Task SendMessage(string message)
{
await Clients.All.SendAsync("newMessage", Context.ConnectionId, message);
}
}
}
Класс Модели:
namespace Project.Models
{
public class User
{
public int Id { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public int? RoleId { get; set; }
public Role Role { get; set; }
}
}
Контроллер Аккаунта
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)
};
// создаем объект ClaimsIdentity
ClaimsIdentity id = new ClaimsIdentity(claims, "ApplicationCookie", ClaimsIdentity.DefaultNameClaimType,
ClaimsIdentity.DefaultRoleClaimType);
// установка аутентификационных куки
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(id));
}
}
}
Класс подключения к бд
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Project.Models
{
public class ApplicationContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Role> Roles { get; set; }
public ApplicationContext(DbContextOptions<ApplicationContext> options)
: base(options)
{
// Database.EnsureDeleted(); // удаляем бд со старой схемой
// Database.EnsureCreated();
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
string adminRoleName = "admin";
string userRoleName = "user";
string adminEmail = "timofey@gmail.com";
string adminPassword = "lol";
// добавляем роли
Role adminRole = new Role { Id = 1, Name = adminRoleName };
Role userRole = new Role { Id = 2, Name = userRoleName ,};
User adminUser = new User { Id = 1, Email = adminEmail, Password = adminPassword, RoleId = adminRole.Id };
modelBuilder.Entity<Role>().HasData(new Role[] { adminRole, userRole });
modelBuilder.Entity<User>().HasData(new User[] { adminUser });
base.OnModelCreating(modelBuilder);
}
}
}
Проблема в том как обратится к полю UserName текущего пользователя через хаб