验证受 Azure AD 保护的 WEB API 的访问令牌
Validate access token for WEB API protected by Azure AD
我正在玩 Azure AD 身份验证和授权方案,但对我来说不是很清楚。
目前我正在查看 SinglePageApp-WebAPI-AngularJS-DotNet
示例项目。
还有一件事我不明白。在客户端,我们使用隐式授权流获取访问令牌——这很清楚。然后我们使用 Bearer
和访问令牌作为值向 WEB API 发送请求。在服务器端,我们有 TodoListController
和 Authorize
属性。所以,要想打到controller请求必须要授权。
不清楚身份验证中间件如何验证我的访问令牌(如果发送随机文本而不是有效访问令牌怎么办?)。我克隆了 katana 项目并调查了 WindowsAzureActiveDirectoryBearerAuthenticationExtensions
和 OAuthBearerAuthenticationHandler
类,但我仍然找不到进行验证的具体位置。
我的 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);
我正在玩 Azure AD 身份验证和授权方案,但对我来说不是很清楚。
目前我正在查看 SinglePageApp-WebAPI-AngularJS-DotNet
示例项目。
还有一件事我不明白。在客户端,我们使用隐式授权流获取访问令牌——这很清楚。然后我们使用 Bearer
和访问令牌作为值向 WEB API 发送请求。在服务器端,我们有 TodoListController
和 Authorize
属性。所以,要想打到controller请求必须要授权。
不清楚身份验证中间件如何验证我的访问令牌(如果发送随机文本而不是有效访问令牌怎么办?)。我克隆了 katana 项目并调查了 WindowsAzureActiveDirectoryBearerAuthenticationExtensions
和 OAuthBearerAuthenticationHandler
类,但我仍然找不到进行验证的具体位置。
我的 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);