ASP.NET CORE Добавление легко доступных свойств зарегистрированному пользователю. - PullRequest
2 голосов
/ 16 октября 2019

В нашем проекте 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;

Возможно ли это (и при этом сохранить его простым)?

РЕДАКТИРОВАТЬ: поскольку нет ответов / предложений, могу ли я сделать то же самое с другим подходом?

1 Ответ

1 голос
/ 28 октября 2019

Похоже, что вы хотите вызывать свои свойства только лучше?

public class ApplicationUser : IdentityUser
{
    public string CustomName { get; set; }
}

Предполагая, что вы добавили дополнительные свойства, вы можете создать метод расширения для своих свойств, чтобы вы могли позже вызватьнапример, User.Identity.GetCustomName().

namespace Project.Extensions
{
    public static class IdentityExtensions
    {
        public static string GetCustomName(this IIdentity identity)
        {
            var claim = ((ClaimsIdentity)identity).FindFirst("CustomName");
            return (claim != null) ? claim.Value : string.Empty;
        }
    }
}

Обратите внимание, что я не включил часть, в которую вы добавляете претензии, потому что она у вас уже есть. В этом случае у вас должна быть заявка CustomName.

Кроме того, @Dementic прав насчет сеанса. Если пользователь удален / отключен, он все равно будет иметь доступ к. Таким образом, каждый раз, когда вам нужно получить информацию, вызов db является правильным.

...