lew*_*wis 2 azure azure-active-directory
我正在尝试遵循https://azure.microsoft.com/en-us/resources/samples/active-directory-dotnet-webapi-manual-jwt-validation/ 中的示例验证代码
我从以下位置获取颁发者/签名密钥:https : //login.microsoftonline.com/efa3038a-575b-42ea-8ba1-483cf7f0bdb6/.well-known/openid-configuration
我通过以下方式获取了我的 AUTH 令牌:https ://login.microsoftonline.com/efa3038a-575b-42ea-8ba1-483cf7f0bdb6/oauth2/v2.0/authorize?client_id = 463f8472-dff3-40d0-8ec5-type32d9-8ec5-type32d9re %3A%2F%2Flocalhost:30662&scope=openid%20profile&response_mode=fragment&state=12345&nonce=678910
产生令牌:eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IkhCeGw5bUFlNmd4YXZDa2NvT1UyVEhzRE5hMCJ9..fKDoCRI7YZEP00otEWiYQhJcdsVsWpsopuIPFS1d75FM7zoyecX3zK90JuOPCN-59i8MQt9yG5vSfYB-IhhkvkjSJBZ_O-T12AQ5jvLFQuEUFmjMjJS6vJzC9QC6-X-Bvv_6dq1naPsLo1OowRnhjAjZYE4u4dTBNWzdquLwy0EJo2JVuaG5aj_R1kp2xjmsFkgJfX_x7My6V0kU3oJ6VjmT2MUKcIj0z3tZrGPQgbDKSStAElwnp7myNef-5Y0Ywv2ns_8ze8-1evbUTKkVJTnFp56qOvMa5EBZi87loRQKGT-G50Ft3oGYn4uxFKWU_pprTz5GxHzd_QnkDe0GVw
将 ( via var jwt = new Microsoft.IdentityModel.JsonWebTokens.JsonWebToken(authorizationHeader.Substring(kBearer_.Length)))解码为: ....
发行人:“ https://login.microsoftonline.com/efa3038a-575b-42ea-8ba1-483cf7f0bdb6/v2.0 ”
然后我尝试使用以下方法进行验证:
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表示“包含将用于检查令牌颁发者的有效颁发者”。
您当前查看的示例有点旧,并以 Azure AD v1.0 终结点作为参考进行了解释。您在令牌中看到的颁发者值是正确的,因为您已从 Azure AD v2.0 终结点获取该令牌。您用来查找有效发行者的 OpenID 发现文档 URL 不正确。更多的解释在进一步的部分。
我还应该简要地提到,在大多数情况下,像您所遵循的示例解释的那样手动显式验证令牌是一些繁重的工作,这并不是真正需要的。我不想偏离您的原始问题,因此我只是在回答的末尾保留了这部分的一些提示,但请看一看这对您的情况是否有意义。
有关从 Azure AD v1.0 和 v2.0 终结点获取的访问令牌的更多详细信息
请查看此 Microsoft 文档 -访问令牌参考 - 示例令牌
注意这个有发行人格式
https://login.microsoftonline.com/<Azure AD Tenant GUID>/v2.0
Run Code Online (Sandbox Code Playgroud)注意这个有发行人格式
https://sts.windows.net/<Azure AD Tenant GUID>/
Run Code Online (Sandbox Code Playgroud)租户的 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。
| 归档时间: |
|
| 查看次数: |
3309 次 |
| 最近记录: |