验证受 Azure AD 保护的 WEB API 的访问令牌

Validate access token for WEB API protected by Azure AD

我正在玩 Azure AD 身份验证和授权方案,但对我来说不是很清楚。
目前我正在查看 SinglePageApp-WebAPI-AngularJS-DotNet 示例项目。

还有一件事我不明白。在客户端,我们使用隐式授权流获取访问令牌——这很清楚。然后我们使用 Bearer 和访问令牌作为值向 WEB API 发送请求。在服务器端,我们有 TodoListControllerAuthorize 属性。所以,要想打到controller请求必须要授权。

不清楚身份验证中间件如何验证我的访问令牌(如果发送随机文本而不是有效访问令牌怎么办?)。我克隆了 katana 项目并调查了 WindowsAzureActiveDirectoryBearerAuthenticationExtensionsOAuthBearerAuthenticationHandler 类,但我仍然找不到进行验证的具体位置。
我的 WEB API 如何知道这个特定的访问令牌是有效的,以及负责验证的具体代码行在哪里?

谢谢!

UPD:

其实我找到了那个地方。所有工作都在方法 OAuthBearerAuthenticationHandler 中完成 AuthenticateCoreAsync:

tokenReceiveContext.DeserializeTicket(tokenReceiveContext.Token);

此调用导致 运行 JwtFormat.Unprotect 方法,该方法执行实际验证。
感谢@Aram 的好笔记。

在您的服务启动时注册 OWIN,当您的控制器装饰有 Authorize 属性时,将发生身份验证挑战,OWIN 将尝试在每个请求上验证令牌..

令牌验证发生是因为您有 OWIN Dll 引用并且您在服务项目中有 startup.auth class...

您可能有这样的事情,您在服务端包含 Auth challenge:

    app.UseWindowsAzureActiveDirectoryBearerAuthentication(
        new WindowsAzureActiveDirectoryBearerAuthenticationOptions
        {
            Audience = ConfigurationManager.AppSettings["ida:Audience"],
            Tenant = ConfigurationManager.AppSettings["ida:Tenant"],
        });

进行验证时,OWIN 中间件将针对从中获取令牌的受众和租户进行验证,如果它们不匹配,Authz 将失败...

根据您使用的身份验证处理程序,调用 ValidateToken 函数的实际代码位于 YOUR_AUTH_HANDLERAuthenticationHandler class.

这是 OpenId AuthZ 处理程序的位置: http://katanaproject.codeplex.com/sourcecontrol/latest#src/Microsoft.Owin.Security.OpenIdConnect/OpenidConnectAuthenticationHandler.cs

例如,如果您有 OpenIdConnect Authz 处理程序,则令牌验证位于:Microsoft.Owin.Security.OpenIdConnect.OpenIdConnectAuthenticationHandler class 和 Overrride 方法:

protected override async Task<AuthenticationTicket> AuthenticateCoreAsync()

ValidateToekn 代码将如下所示(如果您的 AuthZ 处理程序是 OpenId 连接):

ClaimsPrincipal principal = Options.SecurityTokenHandlers.ValidateToken(openIdConnectMessage.IdToken, tvp, out validatedToken);