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

时间:2015-06-11 15:25:10

标签: azure asp.net-web-api azure-active-directory

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

有一点我无法理解。在客户端,我们使用隐式授权流获取访问令牌 - 这很清楚。然后我们使用Bearer向WEB API发送请求,并将访问令牌作为值。在服务器端,我们TodoListController具有Authorize属性。因此,为了击中控制器请求必须经过授权。

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

谢谢!

UPD

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

tokenReceiveContext.DeserializeTicket(tokenReceiveContext.Token);

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

1 个答案:

答案 0 :(得分:3)

在您的服务启动中注册OWIN,当您的控制器使用Authorize属性进行修饰时,将发生身份验证质询,OWIN将尝试在每个请求上验证令牌。

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

你可能有这样的事情,你在服务方面包括Auth挑战:

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

当验证发生时,OWIN中间件将针对Audience和租户验证已获取令牌,如果它们不匹配,Authz将失败...

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

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

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

protected override async Task<AuthenticationTicket> AuthenticateCoreAsync()

ValidateToekn代码看起来像(如果您的AuthZ处理程序是OpenId连接):

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