Настраиваем IdentityServer 4¶
Откроем терминал в в папке решения LearningSignalR. Сперва скачаем шаблоны проектов IdentityServer4:
Далее создадим проект из шаблона1, содержащего Admin UI — в этом шаблоне уже есть user-friedndly интерфейс:
Теперь добавим проект к решению:
Нам нужно добавить немного кода, чтобы вся необходимая информация попадала в аутентификационный токен. Создадим файл 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 добавим
Наконец, убедимся в том, что наше приложение доступно по протоколу https4. Откроем файл AuthProvider/Properties/launchSettings.json и убедимся, что
applicationUrl имеет такой вид (изменим нужную строку, если нужно):Также нам нужно исправить в файле AuthProvider/wwwroot/admin/assets/env.js все URL на
https://localhost::5001
Последнее обновление :
17 июня 2023 г.
Дата создания : 26 февраля 2023 г.
Дата создания : 26 февраля 2023 г.