验证发行者 - 令牌具有发行者 https://login.microsoftonline.com/Xv2.0 但示例暗示我应该使用 https://sts.windows.net/X 进行验证

lew*_*wis 2 azure azure-active-directory

我正在尝试遵循https://azure.microsoft.com/en-us/resources/samples/active-directory-dotnet-webapi-manual-jwt-validation/ 中的示例验证代码

(真的是https://github.com/Azure-Samples/active-directory-dotnet-webapi-manual-jwt-validation/blob/master/TodoListService-ManualJwt/Global.asax.cs#L136 中的代码)

然后我尝试使用以下方法进行验证:

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);
Run Code Online (Sandbox Code Playgroud)

我可以看到令牌中的发行者(仅主机名部分)与https://login.microsoftonline.com/efa3038a-575b-42ea-8ba1-483cf7f0bdb6/.well-known/openid-configuration 中的发行者不同

但我不知道为什么,或者我做错了什么。

我还没有找到任何关于传递给验证过程的参数的有用文档(例如https://docs.microsoft.com/en-us/dotnet/api/system.identitymodel.tokens.jwt.jwtsecuritytokenhandler.validatetoken ?view=azure-dotnet只是说“validationParameters 包含验证参数”,以及https://docs.microsoft.com/en-us/dotnet/api/microsoft.identitymodel.tokens.tokenvalidationparameters.validissuers?view=azure-dotnet# Microsoft_IdentityModel_Tokens_TokenValidationParameters_ValidIssuers表示“包含将用于检查令牌颁发者的有效颁发者”。

Roh*_*gal 6

您当前查看的示例有点旧,并以 Azure AD v1.0 终结点作为参考进行了解释。您在令牌中看到的颁发者值是正确的,因为您已从 Azure AD v2.0 终结点获取该令牌。您用来查找有效发行者的 OpenID 发现文档 URL 不正确。更多的解释在进一步的部分。

我还应该简要地提到,在大多数情况下,像您所遵循示例解释的那样手动显式验证令牌是一些繁重的工作,这并不是真正需要的。我不想偏离您的原始问题,因此我只是在回答的末尾保留了这部分的一些提示,但请看一看这对您的情况是否有意义。

有关从 Azure AD v1.0 和 v2.0 终结点获取的访问令牌的更多详细信息

请查看此 Microsoft 文档 -访问令牌参考 - 示例令牌

租户的 OpenID 发现文档 URL

对于 openid 配置,您应该查看 Azure AD v2.0 端点,您将在那里看到正确的颁发者值。专门为您的租户(如所讨论的那样)使用的正确 URL 将是

https://login.microsoftonline.com/efa3038a-575b-42ea-8ba1-483cf7f0bdb6/v2.0/.well-known/openid-configuration
Run Code Online (Sandbox Code Playgroud)

您当前查看的 OpenID Discovery 文档的值仅适用于从 v1.0 端点获取的令牌。

如何从 Azure 门户找到正确的 OpenID 发现文档 URL

对于 v2.0 Endpoint,进入预览体验,如下图。Azure 门户 > Azure Active Directory > 应用注册(预览)> 终结点

在此处输入图片说明

对于 v1.0 Endpoint,转到旧体验(即将消失)。Azure 门户 > Azure Active Directory > 应用注册 > 终结点

在此处输入图片说明


就像我最初所说的那样,对于大多数应用程序,通常不需要手动令牌验证。

在单租户应用程序的情况下,通常您只需保持ValidateIssuer = true for theTokenValidationParameters`

在多租户应用程序的情况下,可能有几种情况..

  • 如果您事先了解您的发行人,您仍然可以设置ValidateIssuer=True和设置 ValidIssuers 列表。ValidIssuers = new List<string>()...

  • 如果您的应用程序的有效颁发者是动态的,或者如果您想编写一些逻辑来收集该列表,您可以为 TokenValidationParameters.IssuerValidator 编写一个实现,它具有您的自定义逻辑。您只需要设置一个将用于验证颁发者的委托。

  • 在其他情况下,您仍然想编写自己的自定义逻辑,然后像您所遵循的示例一样进行显式验证是有意义的。

请在此处查看相关的 SO Thread