Перейти к содержанию

Настраиваем IdentityServer 4

Откроем терминал в в папке решения LearningSignalR. Сперва скачаем шаблоны проектов IdentityServer4:

dotnet new -i IdentityServer4.Templates

Далее создадим проект из шаблона1, содержащего Admin UI — в этом шаблоне уже есть user-friedndly интерфейс:

dotnet new is4admin -o AuthProvider

Теперь добавим проект к решению:
dotnet sln add AuthProvider/AuthProvider.csproj

Нам нужно добавить немного кода, чтобы вся необходимая информация попадала в аутентификационный токен. Создадим файл UserProfileService.cs в проекте AuthProvider со следующим содержимым (юзинги я опущу):
namespace AuthProvider
{
    public class UserProfileService: IProfileService
    {
        private readonly IUserClaimsPrincipalFactory<ApplicationUser> claimsFactory;
        private readonly UserManager<ApplicationUser> usersManager;

        public UserProfileService(
            UserManager<ApplicationUser> usersManager,
            IUserClaimsPrincipalFactory<ApplicationUser> claimsFactory)
        {
            this.usersManager = usersManager;
            this.claimsFactory = claimsFactory;
        }
    }
}

Наш класс реализует интерфейс IProfileService из неймспейса IdentityServer4.Services, поэтому нам нужно добавить реализации методов этого интерфейса. Сперва реализуем метод GetProfileDataAsync:
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
    var subject = context.Subject.GetSubjectId();
    var user = await usersManager.FindByIdAsync(subject);
    var claimsPrincipal = await claimsFactory.CreateAsync(user);
    var claimsList = claimsPrincipal.Claims.ToList();

    claimsList = claimsList.Where(c => context.RequestedClaimTypes.Contains(c.Type)).ToList();

    //Добавим клеймы, специфичные для пользователя
    claimsList.Add(new Claim(JwtClaimTypes.Email, user.Email));
    claimsList.Add(new Claim(JwtClaimTypes.Name, user.UserName));

    if(usersManager.SupportsUserRole)
    {
        foreach(var roleName in await usersManager.GetRolesAsync(user))
        {
            claimsList.Add(new Claim(JwtClaimTypes.Role, roleName));
            //Специальный клейм для админа
            if(roleName == "admin")
                claimsList.Add(new Claim("admin", "true"));
        }
    }
    context.IssuedClaims = claimsList;
}

Токен JWT имеет полезную нагрузку (пейлоуд, payload) в виде объекта JSON с полями, известными как утверждения (claims, клеймы)2. И здесь мы добавляем к этому объекту некоторые интересующие нас клеймы.

Чтобы закончить имплементацию интерфейса, добавим метод IsActiveAsync:

public async Task IsActiveAsync(IsActiveContext context)
{
    var subject = context.Subject.GetSubjectId();
    var user = await usersManager.FindByIdAsync(subject);
    context.IsActive = user != null;
}

Теперь зарегистрируем наш класс в контейнере зависимостей. Для этого в файле Startup.cs3 проекта AuthProvider в методе ConfigureServices добавим

services.AddScoped<IProfileService, UserProfileService>();

Наконец, убедимся в том, что наше приложение доступно по протоколу https4. Откроем файл AuthProvider/Properties/launchSettings.json и убедимся, что applicationUrl имеет такой вид (изменим нужную строку, если нужно):
"applicationUrl": "https://localhost::5001;http://localhost:5000"

Также нам нужно исправить в файле AuthProvider/wwwroot/admin/assets/env.js все URL на https://localhost::5001


  1. про создание проекта из шаблона также написано тут

  2. Про клеймы в ASP.NET Core подробно рассказывается у Эндрю Лока здесь и здесь

  3. Про класс Startup и файл Startup.cs рассказывается у Эндрю Лока, например здесь

  4. О подробностях работы с протоколом HTTPS в ASP.NET Core Эндрю Лок рассказывает здесь 


Последнее обновление : 17 июня 2023 г.
Дата создания : 26 февраля 2023 г.

Комментарии

Комментарии