В нашем проекте MVC Asp.Net Core (2.2) нам пришлось использовать существующую базу данных (включая все таблицы, связанные с пользователями и ролями) из нашего предыдущего проекта веб-приложения Asp.Net.
Извлечение пользовательских данных вВеб-приложение asp.net (и имеющее его на веб-сайте) было очень просто: при входе в систему заполните пользовательский класс / объект со всеми необходимыми свойствами, сохраните его как переменную Session и вызывайте его везде, где вам это нужно (безпереход к базе данных).
Мне кажется, что в Asp.Net Core это сделать гораздо сложнее. Пока что у меня есть:
Класс ApplicationUser:
public class ApplicationUser : IIdentity
{
public int Id { get; set; }
public Uporabnik Uporabnik { get; set; }
public string AuthenticationType { get; set; }
public bool IsAuthenticated { get; set; }
public string Name { get; set; }
}
Форма входа:
public IActionResult Prijava(PrijavaModel model)
{
// check user credentials
//
// ... validation code here ...
//
if (uporabnik != null)
{
//Create the identity for the user
var identity = new ClaimsIdentity(new[] {
new Claim("Email", model.Email),
new Claim("Id", uporabnik.IdWebUser.ToString()),
new Claim("Name", uporabnik.ImeInPriimek),
new Claim(ClaimTypes.Name, uporabnik.ImeInPriimek),
new Claim(ClaimTypes.PrimarySid, uporabnik.IdWebUser.ToString())
}, CookieAuthenticationDefaults.AuthenticationScheme);
var principal = new ClaimsPrincipal(identity);
var login = HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);
return RedirectToAction("Index", "Home");
}
return View();
}
Теперь, чтобы получить данные в контроллере, мне нужно что-то сделатьвот так:
// id
int idUser = int.Parse(@User.Claims.FirstOrDefault(x => x.Type == "Id").Value);
// or email
string email = @User.Claims.FirstOrDefault(x => x.Type == "Email").Value;
Ну, все это прекрасно работает, но это определенно не практично. Чтобы получить доступ к любым другим данным пользователя, я могу зайти в базу данных (по «идентификатору») и получить ее, но я не думаю, что это правильный способ сделать это!?!
Могу ли я расширить личностьКласс таким образом, что я могу установить дополнительные свойства, которые мне нужны во время входа в систему и получить таким образом, что-то вроде этого:
var property1 = @User.Property1;
var property2 = @User.Property2;
// or
var property1 = @User.MyExtraProperties.Property1;
var property2 = @User.MyExtraProperties.Property2;
Возможно ли это (и при этом сохранить его простым)?
РЕДАКТИРОВАТЬ: поскольку нет ответов / предложений, могу ли я сделать то же самое с другим подходом?