I'm trying to follow the example validation code in https://azure.microsoft.com/en-us/resources/samples/active-directory-dotnet-webapi-manual-jwt-validation/
(REALLY the code in https://github.com/Azure-Samples/active-directory-dotnet-webapi-manual-jwt-validation/blob/master/TodoListService-ManualJwt/Global.asax.cs#L136)
I fetch the issuer/signing keys from: https://login.microsoftonline.com/efa3038a-575b-42ea-8ba1-483cf7f0bdb6/.well-known/openid-configuration
- getting issuer: issuer":"https://sts.windows.net/efa3038a-575b-42ea-8ba1-483cf7f0bdb6/"
-
which produces token: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IkhCeGw5bUFlNmd4YXZDa2NvT1UyVEhzRE5hMCJ9.eyJhdWQiOiI0NjNmODQ3Mi1kZmYzLTQwZDAtOGVjNS1kYTJkOWJhOWMzNDgiLCJpc3MiOiJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vZWZhMzAzOGEtNTc1Yi00MmVhLThiYTEtNDgzY2Y3ZjBiZGI2L3YyLjAiLCJpYXQiOjE1NTYxNTE5NTQsIm5iZiI6MTU1NjE1MTk1NCwiZXhwIjoxNTU2MTU1ODU0LCJhaW8iOiJBVFFBeS84TEFBQUFCUnZQS3kyS2svRGZvc0VhbkZHRkdKOHBSdTd1ZldOY0FMakpBYzI4TnBjdmNsRXJwTVo5VnFQYnhXYkhxUGhVIiwibmFtZSI6Imxld2lzIiwibm9uY2UiOiI2Nzg5MTAiLCJvaWQiOiI3MjM4ZDc1ZS0zN2M3LTRkZjQtOTJlNS01OTYzZDk4NjhjMjUiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJsZXdpc0BwYXJ0aGVub24uc29waGlzdHMuY29tIiwic3ViIjoidVFfWDZ1d1ZRWWptRXp1ZlU2azBlaG42NjR3ZUFwdU1TMkJyOF9XNU8yUSIsInRpZCI6ImVmYTMwMzhhLTU3NWItNDJlYS04YmExLTQ4M2NmN2YwYmRiNiIsInV0aSI6Im5ZNlZBckQ0TGtheHpGVVkycE03QUEiLCJ2ZXIiOiIyLjAifQ.fKDoCRI7YZEP00otEWiYQhJcdsVsWpsopuIPFS1d75FM7zoyecX3zK90JuOPCN-59i8MQt9yG5vSfYB-IhhkvkjSJBZ_O-T12AQ5jvLFQuEUFmjMjJS6vJzC9QC6-X-Bvv_6dq1naPsLo1OowRnhjAjZYE4u4dTBNWzdquLwy0EJo2JVuaG5aj_R1kp2xjmsFkgJfX_x7My6V0kU3oJ6VjmT2MUKcIj0z3tZrGPQgbDKSStAElwnp7myNef-5Y0Ywv2ns_8ze8-1evbUTKkVJTnFp56qOvMa5EBZi87loRQKGT-G50Ft3oGYn4uxFKWU_pprTz5GxHzd_QnkDe0GVw
which decodes (
via var jwt = new Microsoft.IdentityModel.JsonWebTokens.JsonWebToken(authorizationHeader.Substring(kBearer_.Length))) to: ....
Issuer: "https://login.microsoftonline.com/efa3038a-575b-42ea-8ba1-483cf7f0bdb6/v2.0"
I then attempt to validate using:
TokenValidationParameters validationParams = new TokenValidationParameters
{
// We accept both the App Id URI and the AppId of this service application
ValidAudiences = new[] { kADConfiguration_.Audience, kADConfiguration_.ClientId },
// Supports both the Azure AD V1 and V2 endpoint
ValidIssuers = new[] { _issuer, $"{_issuer}/v2.0" },
ValidateIssuer = true, // set to false and works, set to true it fails
IssuerSigningKeys = validationInfo.Item2
};
Microsoft.IdentityModel.Tokens.SecurityToken v;
System.Security.Claims.ClaimsPrincipal answer = handler.ValidateToken(authorizationHeader.Substring(kBearer_.Length), validationParams, out v);
I can see that the issuer in the token differs (just the hostname part) from the issuer in the https://login.microsoftonline.com/efa3038a-575b-42ea-8ba1-483cf7f0bdb6/.well-known/openid-configuration
But I cannot tell why, or what I'm doing wrong.
I haven't yet found any useful documentation on what parameters to pass to the validation process (for example https://docs.microsoft.com/en-us/dotnet/api/system.identitymodel.tokens.jwt.jwtsecuritytokenhandler.validatetoken?view=azure-dotnet just says "validationParameters Contains validation parameters", and https://docs.microsoft.com/en-us/dotnet/api/microsoft.identitymodel.tokens.tokenvalidationparameters.validissuers?view=azure-dotnet#Microsoft_IdentityModel_Tokens_TokenValidationParameters_ValidIssuers which says "contains valid issuers that will be used to check against the token's issuer."

