子声明缺少ProfileDataRequestContext.RequestedClaimTypes

时间:2019-10-03 10:31:54

标签: asp.net-core identityserver4

在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 name 角色

enter image description here

为什么“子”要求丢失了?

谢谢!

1 个答案:

答案 0 :(得分:1)

sub声明是spec要求的声明,因此它是StandardScopes.OpenId的一部分。您无需额外设置或请求。

var sub = context.Subject.GetSubjectId();

假设sub声明已在上下文中。否则,将引发异常。

以上所有内容与IdentityResourceid_token有关。可以创建token的{​​{1}}而不引用用户。