To avoid leaking confidential data, AspNet.Security.OpenIdConnect.Server
refuses to serialize the claims that don't explicitly specify a destination.
To serialize the name (or any other claim), you can use the .SetDestinations
extension:
var principal = await factory.CreateAsync(user);
var name = principal.FindFirst(ClaimTypes.Name);
if (name != null) {
// Use "id_token" to serialize the claim in the identity token or "access_token"
// to serialize it in the access token. You can also specify both destinations.
name.SetDestinations(OpenIdConnectConstants.Destinations.AccessToken,
OpenIdConnectConstants.Destinations.IdentityToken);
}
context.Validate(principal);
When adding a claim, you can also use the AddClaim
extension taking a destinations
parameter:
identity.AddClaim(ClaimTypes.Name, "Pinpoint",
OpenIdConnectConstants.Destinations.AccessToken,
OpenIdConnectConstants.Destinations.IdentityToken);
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…