我一直在使用Bearer令牌处理ASP.NET Core 2.0应用程序。与令牌和身份验证相关的所有内容都已正常运行。
我刚刚实施了不同的授权流程。现在,我不是使用Authorize
属性来实施策略,而是使用IAuthorizationService
和DefaultAuthorizationPolicyProvider
方法。
但是,我看到了一些我没想到的东西,也无法找到解决方案或找到有关问题的有用文档。
我正在Startup.cs
中配置承载令牌,如下所示:
.AddJwtBearer(options =>
{
options.TokenValidationParameters = tokenValidationParameters;
});
验证参数构建如下:
return new TokenValidationParameters
{
// The signing key must match!
ValidateIssuerSigningKey = true,
IssuerSigningKey = GetSymmetricSecurityKey(configuration),
ValidateIssuer = true,
ValidIssuer = configuration.GetSection("TokenAuthentication:Issuer").Value,
ValidateAudience = true,
ValidAudience = configuration.GetSection("TokenAuthentication:Audience").Value,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero // leave at zero, we validate expiry!
};
我的授权设置代码如下所示:
public static void AddAuthorisationPolicies(this IServiceCollection services)
{
services.AddAuthorization();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddTransient<IAuthorizationPolicyProvider, AuthorisationPolicyProvider>();
services.AddTransient<IAuthorizationHandler, RoleClaimHandler>();
}
这一切都按预期工作。在我的控制器中,我现在可以注入一个授权服务的实例:
public SyncController(IAuthorizationService auth)
我的要求和处理程序都按预期工作等等。现在在动作方法控制器中,我可以这样做:
var auth = await authz.AuthorizeAsync(User, "Administrator");
if (!auth.Succeeded)
{
return Challenge();
}
...
当令牌有效时,ClaimsPrinciple
被正确设置意味着对有效用户执行AuthorizeAsync
的调用。
我看到的是,我没想到的是,如果请求过期Bearer
,请求仍然会到达操作方法,但是空ClaimsPrinciple
。
我必须在某处丢失一些关键设置。我没想到会发生这种情况,用空用户调用AuthorizeAsync
没有任何意义。严格来说,这并没有打开任何安全漏洞,因为对于空用户,对AuthorizeAsync
的调用总是会失败,但它不是特别干净,明智或合乎逻辑。
如何阻止带有过期令牌的请求通过请求管道获取此内容?
这实际上是预期的行为,还是我必须推出自己的流程(更多中间件?)进行此过期检查,因为我绕过了内置的AuthorizeAttribute
逻辑?
我希望ValidateLifetime = true
继续拒绝请求,因为我已经更改了授权的工作方式,而不是身份验证。
答案 0 :(得分:1)
如果您的控制器上没有authorize属性(或全局应用),则在您调用授权服务之前,身份验证不会运行,因为它不知道您的控制器需要经过身份验证的用户。
向控制器添加一个简单的[Authorize]将在进入操作方法之前验证持有者令牌。