Я использую следующее руководство по настройке проекта IdentityServer4 Angular по умолчанию: https://docs.microsoft.com/ja-jp/aspnet/core/security/authentication/identity-api-authorization?view=aspnetcore-3.0
Я хочу сделать запрос к конечной точке контроллера с этим и получить идентификатор пользователя (сохраненный вбазы данных).
Самый быстрый способ сделать это, по-видимому, поместить идентификатор пользователя в токен JWT в качестве утверждения, я попытался сделать это с помощью IProfileService. Это выглядит так:
public class CustomClaimProfileService: IProfileService
{
private readonly IUserClaimsPrincipalFactory<ApplicationUser> _claimsFactory;
private readonly UserManager<ApplicationUser> _userManager;
public CustomClaimProfileService(IUserClaimsPrincipalFactory<ApplicationUser> claimsFactory, UserManager<ApplicationUser> userManager)
{
_claimsFactory = claimsFactory;
_userManager = userManager;
}
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var subId = context.Subject.GetSubjectId();
var user = await _userManager.FindByIdAsync(subId);
var principal = await _claimsFactory.CreateAsync(user);
var claims = principal.Claims.ToList();
claims = claims.Where(claim => context.RequestedClaimTypes.Contains(claim.Type)).ToList();
claims.Add(new Claim(JwtClaimTypes.Id, user.Id));
context.IssuedClaims = claims;
}
public async Task IsActiveAsync(IsActiveContext context)
{
context.IsActive = true;
}
}
Добавление службы в качестве моей последней службы в ConfigureServices, например:
services.AddTransient<IProfileService, CustomClaimProfileService>();
Я хотел использовать метод AddProfileService <> (), который я виделотчеты работают лучше, но это не работает, даже когда я помещаю оба файла с использованием IdentityServer4 в свой файл и имею пакет nuget IdentityServer4, поэтому не уверен, в чем проблема.
Я видел сообщения людей, говорящих AddTransientхотя это также должно работать, если вы поставите его в конце.
Теперь пытаемся получить доступ к заявке следующим образом:
// POST: api/PracticeSession
[HttpPost]
public InitialPracticeRequestResult Post([FromBody] InitialPracticeRequest request)
{
var idClaim = User.Claims.Where(c => c.Type == ClaimTypes.NameIdentifier).FirstOrDefault();
if (idClaim != null)
{
return initialSessionRequestHandler.InitializePracticeSession(request, idClaim.Value);
}
else
{
throw new ArgumentException();
}
}
Заявки пользователя пусты, я проверил с помощью отладчика ипохоже, GetProfileDataAsync не вызывается.
Итак, теперь я прочитал, что перед тем, как заявка фактически будет введена в токен, необходимо указать эту заявку как одну из заявок, которые должны быть в токене при определении ресурса. Согласно документам http://docs.identityserver.io/en/latest/reference/identity_resource.html.
Это главный вопрос, который у меня есть сейчас: как мне поступить с этим шаблоном? ?
В соответствии с приведенными выше мс документами о методе AddIdentityServerJWT (), вызываемом в Startup.cs:
AddIdentityServerJwt Этот вспомогательный метод настраивает схему политики для приложения в качестве обработчика аутентификации по умолчанию,Политика настроена так, что Identity может обрабатывать все запросы, направленные на любой подпуть в пространстве URL-адресов Identity "/ Identity". JwtBearerHandler обрабатывает все остальные запросы. Кроме того, этот метод регистрирует ресурс API API <> в IdentityServer с областью по умолчанию <> API и настраивает промежуточное программное обеспечение токенов JWT Bearer для проверки токенов, выпущенных IdentityServer для приложения.
Теперь, покакак я вижу в документации по IdentityServer4, заявки, которые должны быть помещены в токен для ресурса, должны быть определены вместе с самим ресурсом. Насколько я вижу, этот вспомогательный метод уже определил для меня ресурс, так как же тогда определить требования, которые мне нужны в моем токене? Я смотрю в нужном месте?
Спасибо