我正在使用Azure AD身份验证和授权方案,但对我来说并不是很清楚
目前我在查看SinglePageApp-WebAPI-AngularJS-DotNet
示例项目。
有一点我无法理解。在客户端,我们使用隐式授权流获取访问令牌 - 这很清楚。然后我们使用Bearer
向WEB API发送请求,并将访问令牌作为值。在服务器端,我们TodoListController
具有Authorize
属性。因此,为了击中控制器请求必须经过授权。
不清楚身份验证中间件如何验证我的访问令牌(如果发送随机文本而不是有效访问令牌,该怎么办?)。我克隆了katana项目并调查了WindowsAzureActiveDirectoryBearerAuthenticationExtensions
和OAuthBearerAuthenticationHandler
类,但我仍然找不到验证发生的具体位置。
我的WEB API如何知道这个特定的访问令牌是有效的,这个具体的代码行在哪里负责验证?
谢谢!
UPD :
其实我找到了这个地方。所有工作都在方法OAuthBearerAuthenticationHandler
中的AuthenticateCoreAsync
内完成:
tokenReceiveContext.DeserializeTicket(tokenReceiveContext.Token);
此调用会导致运行JwtFormat.Unprotect
方法,该方法会执行实际验证
感谢@Aram提供了很好的笔记。
答案 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);