Подпретензия отсутствует в ProfileDataRequestContext.RequestedClaimTypes - PullRequest
0 голосов
/ 03 октября 2019

В IdentityServer4 я определил IdentityResource с некоторыми утверждениями:

new IdentityResource {
  Name = "userdata",
  UserClaims = new List<string> {
    JwtClaimTypes.Subject,
    JwtClaimTypes.Role,
    JwtClaimTypes.Email,
    JwtClaimTypes.Name
  }
}

И затем добавьте его в области в конфигурации клиента:

AllowedScopes = {
  IdentityServerConstants.StandardScopes.OpenId,
  "api1",
  "userdata"
}

В клиентском приложении, которое я запросилэта область действия:

.AddOpenIdConnect("oidc", options => {
  options.Scope.Add("openid");
  options.Scope.Add("userdata");
  options.Scope.Add("offline_access");
  options.Scope.Add("api1");
}

В IS4 я реализовал IProfileService , чтобы добавить некоторые утверждения в id_token.

public async Task GetProfileDataAsync(ProfileDataRequestContext context) {

  var sub = context.Subject.GetSubjectId();
  var user = await _userManager.FindByIdAsync(sub);
  if (user == null) {
    throw new ArgumentException("");
  }

  var principal = await _claimsFactory.CreateAsync(user);
  var userClaims = principal.Claims.ToList();

  var claims = new List<Claim> {
    userClaims.Find(x => x.Type == JwtClaimTypes.Subject),
    userClaims.Find(x => x.Type == JwtClaimTypes.Role),
    userClaims.Find(x => x.Type == JwtClaimTypes.Email),
    userClaims.Find(x => x.Type == JwtClaimTypes.Name),
    new Claim("iesseapetenantid", user.TenantId.ToString())
  };

  var requestedClaimTypes = context.RequestedClaimTypes;

  context.AddRequestedClaims(claims);
}

context.AddRequestedClaims(claims) отфильтровать принятые утверждения и добавитьтолько те, которые были запрошены клиентом.

Проблема в том, что в context.RequestedClaimTypes требование sub отсутствует, но есть три других: email , имя и роль .

enter image description here

Почему пропадает требование "sub"?

Спасибо!

1 Ответ

1 голос
/ 03 октября 2019

Требование sub является требованием spec , поэтому оно является частью StandardScopes.OpenId. Вам не нужно устанавливать или запрашивать его дополнительно.

var sub = context.Subject.GetSubjectId();

предполагает, что утверждение sub уже находится в контексте. Если нет, то будет сгенерировано исключение.

Все вышеизложенное касается IdentityResource и id_token. token для ApiResource может быть создан без ссылки на пользователя.

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