Rozszerzając odpowiedź cooxkie i odpowiedź dpix , kiedy czytasz token jwt (taki jak access_token otrzymany z AD FS), możesz scalić oświadczenia w tokenie jwt z oświadczeniami z „context.AuthenticationTicket.Identity”, które może nie mają ten sam zestaw oświadczeń co token jwt.
Aby zilustrować, w przepływie kodu uwierzytelniającego przy użyciu OpenID Connect, po uwierzytelnieniu użytkownika, możesz obsłużyć zdarzenie SecurityTokenValidated, które zapewnia kontekst uwierzytelniania, a następnie możesz go użyć do odczytania access_token jako tokena jwt, a następnie możesz " merge ”tokeny znajdujące się w access_token ze standardową listą oświadczeń otrzymanych w ramach tożsamości użytkownika:
private Task OnSecurityTokenValidated(SecurityTokenValidatedNotification<OpenIdConnectMessage,OpenIdConnectAuthenticationOptions> context)
{
//get the current user identity
ClaimsIdentity claimsIdentity = (ClaimsIdentity)context.AuthenticationTicket.Identity;
/*read access token from the current context*/
string access_token = context.ProtocolMessage.AccessToken;
JwtSecurityTokenHandler hand = new JwtSecurityTokenHandler();
//read the token as recommended by Coxkie and dpix
var tokenS = hand.ReadJwtToken(access_token);
//here, you read the claims from the access token which might have
//additional claims needed by your application
foreach (var claim in tokenS.Claims)
{
if (!claimsIdentity.HasClaim(claim.Type, claim.Value))
claimsIdentity.AddClaim(claim);
}
return Task.FromResult(0);
}