【问题标题】:secure webapi with a valid JWT based on claims具有基于声明的有效 JWT 的安全 webapi
【发布时间】:2017-07-10 19:44:41
【问题描述】:

Here 是我创建基于声明的授权属性的方式。但我对它的工作原理有些怀疑。

鉴于我的启动课程中的代码:

public void Configuration(IAppBuilder app)
    {
        if (app == null)
        {
            throw new ArgumentNullException(nameof(app));
        }

        app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
        {
            Authority = ConfigurationManager.AppSettings["Authentication:Authority"],
            RequiredScopes = ConfigurationManager.AppSettings["Authentication:Scopes"].Split(' ').ToList(),
            PreserveAccessToken = true
        });
    }

我期待如果我有这个属性给我的控制器并且我发送了一个无效的令牌(无效的签名)请求将被自动拒绝为未经授权,但来自属性的代码被执行。

OWIN 不应该先验证令牌吗?

如何确保令牌有效(有效的严格、签名、未过期等)并且仅在验证声明之后?

【问题讨论】:

  • 来自您之前的问题:如果您将返回语句 return token.Claims.Any 更改为 return token.Claims.All,您仍然会收到此错误吗?
  • @Tinwor 这将要求 所有 令牌上的声明是相同的,而不是只检查其中任何一个是否匹配

标签: c# asp.net-web-api2 owin jwt claims-based-identity


【解决方案1】:

问题在于您在ClaimAuthorizationAttribute 中的链接问题 - 它从来没有调用base.IsAuthorized(),因此绕过了AuthorizeAttribute 提供的内置保护机制。

而不是在查看声明是否存在后返回这里:

return token.Claims.Any(c => c.Type.Equals(this.Claim) && c.Value.Equals("True", StringComparison.OrdinalIgnoreCase));

您应该继续确保基类得到满足,因此令牌本身也是有效的:

var claimValid = token.Claims.Any(c => c.Type.Equals(this.Claim) && c.Value.Equals("True", StringComparison.OrdinalIgnoreCase));
if (claimValid)
    return base.IsAuthorized();
else
    return false;

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 2010-09-18
  • 2015-03-02
  • 2017-04-04
  • 2020-04-10
  • 2012-06-23
  • 2012-12-08
相关资源
最近更新 更多