在 [Authorize] 属性期间检查 'Whitelist' Table (ASP.Net MVC5 Web API JWT)

Checking 'Whitelist' Table during [Authorize] Attribute (ASP.Net MVC5 Web API JWT)

我按照这篇文章获得了从 .Net Web 发布的 JWT API http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/

TL;DR

我如何向 Authorize 属性添加额外的逻辑以根据 JWT 中的特定声明检查数据库 table,也许在 JwtBearerAuthenticationOptions 中?

更长的版本...

它可以很好地生成 JWT 并在针对包含授权的控制器发出请求时验证它 header...

基本上,文章没有涉及的是撤销...

经过大量谷歌搜索后,我发现有几种使用 JWT 处理撤销的方法。

我选择了 'Whitelist' 路由,因此创建了一个 table 来存储 UserId、ClientId(受众)和一个包含 JTI 值 (GUID) 的列。

基本上,我想向 [Authorize] 属性添加额外的逻辑,以同时检查此 table 是否为给定的 User 和 ClientId 匹配 JTI...

这是否可行而无需编写自定义 'JWTAuthorize' 属性,因为我很想使用默认值...

我怀疑这是需要在 JwtBearerAuthenticationOptions 中指定的东西?

干杯!

我已经使用 JwtBearerAuthenticationOptions 上的自定义提供程序成功实现了此功能。

提供者继承自IOAuthBearerAuthenticationProvider,然后我专门使用ValidateIdentity方法来处理额外的逻辑。

    public Task ApplyChallenge(OAuthChallengeContext context)
    {
        return Task.FromResult<object>(null);
    }

    public Task RequestToken(OAuthRequestTokenContext context)
    {
        return Task.FromResult<object>(null);
    }

    public Task ValidateIdentity(OAuthValidateIdentityContext context)
    {
        string userId = // user id from Token...
        Guid tokenId = // jti from Token...
        string appId = // aud/client id from Token...

        //do the DB check here...
        if (CheckUserToken(userId, tokenId, appId))
        {
            return Task.FromResult<object>(null);
        }
        else
        {
            context.SetError("unauthorized_access", "The supplied security identity for this user is not valid.");
            return Task.FromResult<object>(null);
        }
    }

然后我在客户端处理错误以决定将用户重定向到哪里等等...

如果有人有任何更好的建议,我很乐意看到他们:)