Я пытаюсь создать гибридный поток, и у меня есть претензии к возвращенному токену доступа с IdentityServer4.Я использую QuickStart UI контроллеры.
В моем AccountController
после успешной аутентификации пользователя у меня есть следующий код, который его подписывает:
await HttpContext.SignInAsync("anon@nymous.com", "anon@nymous.com", null, new Claim("MyName", "Ophir"));
На веб-сайте MVC, который вызывает этот поток, на странице, которую я хочу «защитить», у меня есть следующий код:
[Authorize]
public IActionResult RestrictedMvcResource()
{
var token = _httpContext.HttpContext.GetTokenAsync("access_token").Result;
var identity = User.Identity;
return View();
}
После успешного входа в систему отладчик в порядке выполняет этот код, и я 'я получаю токен доступа.
Проблема в том, что если я декодирую свой токен доступа (я использую https://jwt.io/), я вижу имя и тему, но не вижу претензию MyName
что я определил.
(в моей системе есть другой поток для client_credentials
, который возвращает утверждения на токене, но использует другой поток кода).
Как мневернуть заявки на токен для гибридного потока?
РЕДАКТИРОВАТЬ:
Решение этой проблемы было комбинацией 2 вещей:
- Реализация
IProfileService
как предложено в (выбранном) ответе. Вот моя реализация:
public class ProfileService : IProfileService
{
public Task GetProfileDataAsync(ProfileDataRequestContext context)
{
context.AddRequestedClaims(context.Subject.Claims);
foreach (Claim claim in context.Subject.Claims)
{
if (context.IssuedClaims.Contains(claim))
continue;
context.IssuedClaims.Add(claim);
}
return Task.FromResult(0);
}
public Task IsActiveAsync(IsActiveContext context)
{
context.IsActive = true;
return Task.FromResult(0);
}
}
Это добавит любую претензию, которой еще нет в токене.
При звонке
HttpContext.SignInAsync
вы должны передать список претензий, иначе никаких дополнительных претензий в коллекции
context.Subject.Claims
не будет.