使用 Microsoft.Identity.Web 从 AzureAD 验证 JWT 成功但随后在同一调用中失败

Validating a JWT from AzureAD using Microsoft.Identity.Web succeeds but then fails in the same call

我有一个 API 需要使用 AzureAD 进行保护,以便它可以使用 SSO。

API有一个SwaggerUI,所以我有(看了很多很多tutorials/explanations/issues):

按照:https://github.com/AzureAD/microsoft-identity-web/wiki/web-apis,API中的设置如下:

builder.Services.AddMicrosoftIdentityWebApiAuthentication(builder.Configuration, subscribeToJwtBearerMiddlewareDiagnosticsEvents: true);

appsettings.json:

{
   ...
   "AzureAd": {
        "Instance": "https://login.microsoftonline.com/",
        "TenantId": "{guid for tenant ID from Azure portal}",
        "ClientId": "{guid for client ID from Azure portal}",
        "CallbackPath": "/signin-oidc",
        "SignedOutCallbackPath ": "/signout-callback-oidc"
    }
}

我现在有了 swagger 的授权按钮。

当我点击按钮时,我得到一个对话框:

输入客户端 ID,select 范围并单击授权。 Azure AD 登录 window 在新选项卡中打开,输入 creds 并提交,然后我们被重定向回 swagger,我们获得授权:

到目前为止一切顺利。

然后我尝试调用 API 本身,但失败并返回 401。

检查请求我可以看到 JWT 令牌作为 Bearer 令牌传递。

所以我在 JwtBearerMiddlewareDiagnostics 中设置了一些断点以尝试找出问题所在。

以下事件按以下顺序触发:

作为比较,如果我让 JWT 过期,我得到:

所以,我遇到的问题是,当我的 JWT 有效时,OnTokenValidatedAsync 会触发并显示有效的 UserPrinciple,其中 Identity 显示用户已通过验证..但紧接着,身份验证挑战就会触发其中 UserPrinciple 显示用户 not 验证...然后由于我没有处理 OnChallengeAsync 事件,返回 401。我的理解是,如果没有有效令牌(在 JWT 流中),则调用 OnChallengeAsync,但调用 OnTokenValidatedAsync 表明令牌已正确传递且用户有效?!

此外,当我遇到“有效失败”(令牌已过期)时,传递给 OnChallengeAsync 的上下文在 AuthenticationFailure 属性 中清楚地显示了原因,但是当OnChallengeAsync 为我的(据我所知)好令牌开火,AuthenticationFailure 为空...

终于找到问题了。

我失踪了app.UseAuthentication();。添加该行,解决了问题并且它按预期工作:)