Answer the question
In order to leave comments, you need to log in
How to configure Hub in .net core 3.1 SignalR to access a field and not just a single email?
I’m doing a chat, I ran into a problem with displaying the user’s Nickname, after changing the database, I don’t know how to access any user fields that I specify when registering
My hub:
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 = "[email protected]";
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);
}
}
}
Answer the question
In order to leave comments, you need to log in
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question