Mở rộng trên câu trả lời cooxkie và câu trả lời dpix , khi bạn đang đọc mã thông báo jwt (chẳng hạn như access_token nhận được từ AD FS), bạn có thể hợp nhất các xác nhận quyền sở hữu trong mã thông báo jwt với các xác nhận quyền sở hữu từ "context.AuthenticationTicket.Identity" mà có thể không có cùng một tập hợp xác nhận quyền sở hữu như mã thông báo jwt.
Để minh họa, trong luồng Mã xác thực sử dụng OpenID Connect, sau khi người dùng được xác thực, bạn có thể xử lý sự kiện SecurityTokenValidated cung cấp cho bạn bối cảnh xác thực, sau đó bạn có thể sử dụng nó để đọc access_token dưới dạng mã thông báo jwt, sau đó bạn có thể " hợp nhất "mã thông báo trong access_token với danh sách tiêu chuẩn của các yêu cầu nhận được như một phần của danh tính người dùng:
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);
}