ASP.NET Core 2.0 IAuthorizationService和过期的承载令牌

时间:2018-04-24 15:47:48

标签: c# asp.net asp.net-core authorization

我一直在使用Bearer令牌处理ASP.NET Core 2.0应用程序。与令牌和身份验证相关的所有内容都已正常运行。

我刚刚实施了不同的授权流程。现在,我不是使用Authorize属性来实施策略,而是使用IAuthorizationServiceDefaultAuthorizationPolicyProvider方法。

但是,我看到了一些我没想到的东西,也无法找到解决方案或找到有关问题的有用文档。

我正在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继续拒绝请求,因为我已经更改了授权的工作方式,而不是身份验证。

1 个答案:

答案 0 :(得分:1)

如果您的控制器上没有authorize属性(或全局应用),则在您调用授权服务之前,身份验证不会运行,因为它不知道您的控制器需要经过身份验证的用户。

向控制器添加一个简单的[Authorize]将在进入操作方法之前验证持有者令牌。