身份服务器和访问令牌声明
Identity Server and Access Token Claims
我正在使用具有 windows 身份验证的身份服务器 3,并向用户的令牌添加声明。我注意到 GetProfileDataAsync 被调用了两次,调用者是 "ClaimsProviderAccessToken",没有任何请求的声明,而 "ClaimsProviderIdentityToken" 是调用者。如何获取 "ClaimsProviderAccessToken" 中的 RequestedClaimTypes,例如角色、电子邮件等??
public override Task GetProfileDataAsync(ProfileDataRequestContext context)
{
// issue the claims for the user
var user = Users.SingleOrDefault(x => x.Subject == context.Subject.GetSubjectId());
if (user != null && context.RequestedClaimTypes != null)
{
context.IssuedClaims = user.Claims.Where(x => context.RequestedClaimTypes.Contains(x.Type));
}
//NOTE: Uncomment and all the claims I need are in access token ?? Comment out and no claims in Access Token ??
//context.IssuedClaims = user.Claims;
return Task.FromResult(0);
}
这是我的范围声明,它要求声明包含在访问令牌中:
new Scope
{
Name = "api",
Enabled = true,
DisplayName = "Sample API",
Description = "Access to a simple API",
Type= ScopeType.Resource,
IncludeAllClaimsForUser = true,
Claims = new List<ScopeClaim>
{
new ScopeClaim(Constants.ClaimTypes.Name),
new ScopeClaim(Constants.ClaimTypes.Role),
new ScopeClaim(Constants.ClaimTypes.Email),
},
ScopeSecrets = new List<Secret>
{
new Secret("api-secret".Sha256())
}
}
我是不是遗漏了什么,或者将 context.IssuedClaims 设置为 user.Claims 是否正确,或者我应该通过 RequestedClaimTypes 提交?我真的迷失了一点试图弄清楚它是如何工作的并且不确定是否设置 context.IssuedClaims = user.Claims 尽管这似乎是我需要的行为 ???
我实际上找到了答案,设置 IncludeAllClaimsForUser = true 清除了声明,一旦我在请求访问令牌时删除了 context.RequestedClaimsTypes 不为空。
我正在使用具有 windows 身份验证的身份服务器 3,并向用户的令牌添加声明。我注意到 GetProfileDataAsync 被调用了两次,调用者是 "ClaimsProviderAccessToken",没有任何请求的声明,而 "ClaimsProviderIdentityToken" 是调用者。如何获取 "ClaimsProviderAccessToken" 中的 RequestedClaimTypes,例如角色、电子邮件等??
public override Task GetProfileDataAsync(ProfileDataRequestContext context)
{
// issue the claims for the user
var user = Users.SingleOrDefault(x => x.Subject == context.Subject.GetSubjectId());
if (user != null && context.RequestedClaimTypes != null)
{
context.IssuedClaims = user.Claims.Where(x => context.RequestedClaimTypes.Contains(x.Type));
}
//NOTE: Uncomment and all the claims I need are in access token ?? Comment out and no claims in Access Token ??
//context.IssuedClaims = user.Claims;
return Task.FromResult(0);
}
这是我的范围声明,它要求声明包含在访问令牌中:
new Scope
{
Name = "api",
Enabled = true,
DisplayName = "Sample API",
Description = "Access to a simple API",
Type= ScopeType.Resource,
IncludeAllClaimsForUser = true,
Claims = new List<ScopeClaim>
{
new ScopeClaim(Constants.ClaimTypes.Name),
new ScopeClaim(Constants.ClaimTypes.Role),
new ScopeClaim(Constants.ClaimTypes.Email),
},
ScopeSecrets = new List<Secret>
{
new Secret("api-secret".Sha256())
}
}
我是不是遗漏了什么,或者将 context.IssuedClaims 设置为 user.Claims 是否正确,或者我应该通过 RequestedClaimTypes 提交?我真的迷失了一点试图弄清楚它是如何工作的并且不确定是否设置 context.IssuedClaims = user.Claims 尽管这似乎是我需要的行为 ???
我实际上找到了答案,设置 IncludeAllClaimsForUser = true 清除了声明,一旦我在请求访问令牌时删除了 context.RequestedClaimsTypes 不为空。