Должен ли я хранить небольшой аватар с изображением в ClaimsIdentity в ядре ASP.NET? если нет, как лучше? - PullRequest
0 голосов
/ 14 октября 2019

Я новичок в ядре ASP.NET и разрабатываю веб-сайт (ядро .NET 2.1) с логином пользователя.

Я хотел бы иметь возможность отображать изображение аватара пользователя на всех страницах, которые используют_Layout.cshtml. Итак, внутри этого файла для имени пользователя, которое я уже использую: @User.Identity.Name. Теперь я хотел бы использовать что-то вроде этого: @User.Claims.First("avatar")

Я использую аутентификацию на основе файлов cookie:

В моих файлах "Startup.cs":

public void ConfigureServices(IServiceCollection services) {
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    // support for cookie based authentication
    services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(options => {
            options.Cookie.HttpOnly = true;
            options.LoginPath = "/Account/Login";
        });
}

Вмой "AccountController":

[HttpPost]
public async Task<IActionResult> Login(LoginModel m) {
    var user = Authenticate(m.Email, m.Password); // returns null when authentication fails
    if (user!=null) {
        var userIdentity = new ClaimsIdentity(
            new List<Claim> {
                new Claim(ClaimTypes.Name, user.Company.Name),
                new Claim(ClaimTypes.Email, user.Email)
            }, "login");
        ClaimsPrincipal principal = new ClaimsPrincipal(userIdentity);
        await HttpContext.SignInAsync(principal);
        return Redirect("/"); // redirect after authentication
    }
    return View("Login"); // default view if cannot authenticate
}

Изображение аватара будет храниться в базе данных Firebase, поэтому мне нужно избегать запросов к базе данных для каждого запроса страницы моего сайта.

С тех пор"используются для правил авторизации, я не думаю, что должен использовать это для хранения" маленького "байтового массива, который я могу использовать для рендеринга изображения JPG. Поскольку я показываю его на каждой странице во время сеанса пользователя, я хочу загрузить изображение в оперативную память сервера во время входа в систему и сделать так, чтобы оно оставалось там до тех пор, пока пользователь остается в системе.

I 'Мы нашли много примеров, когда люди расширяют класс ClaimsPrincipal для добавления новых свойств, но это требует некоторого другого изменения кода (похоже, связано с IdentityModel с использованием каркаса сущностей) и фабрики для объектов ClaimsPrincipal. (Если мне нужно пойти по этому пути, я бы хотел небольшой пример, начиная с кода, который я предоставил)

Вспоминая, что я новичок в ASP.NET core MVC ... Если кто-то может указать мне на хорошийНаправление я был бы признателен.

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Я не понимаю, почему аватар отображается только когда пользователь онлайн. Видит ли только сам пользователь свой аватар?

Но в настоящее время я также работаю над идентификацией для своего проекта, и, возможно, это решение работает и для вас.

У меня есть небольшая логика контроллера дляизображения, лежащие в основе. Все изображения находятся в базе данных и обслуживаются специальным MediaController. Я также кеширую их в папке, но это уже другая история. Этот MediaController обслуживает все изображения, идентифицированные по его идентификатору. Маршрут / media / images / {imageId: int}

Это также будет работать с именем файла вместо идентификатора. Зачем обрабатывать изображение профиля, отличное от всех других изображений?

Мой класс IdentityUser выглядит следующим образом:

using System;
using Microsoft.AspNetCore.Identity;

namespace MyProject.Identity
{
    public class MyProjectIdentity : IdentityUser<string>
    {
        //other properties...

        public int ProfilePicId { get; set; }

        //more other properties...
    }
}

На каждом представлении, где я показываю аватар, я просто делаю:

<img src="~/media/images/@User.ProfilePicId" alt="Profile Pic" />
0 голосов
/ 15 октября 2019

Вы можете добавить пользовательские утверждения следующим образом:

new Claim("Avatar", Convert.ToBase64String(byteArray));

Поскольку они принимают только строки, вы должны преобразовать ваш байтовый массив в строку base64.

Однако я считаю, что лучше всегоЧтобы сделать это, нужно иметь какое-то хранилище, а затем сохранить только URL-адрес изображения в базе данных (и в формуле изобретения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...