在[Authorize]属性期间检查“白名单”表(ASP.Net MVC5 Web API JWT)

时间:2018-08-29 21:20:50

标签: c# asp.net-mvc asp.net-web-api2 jwt owin

我遵循本文以获得从.Net Web API发出的JWT http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/

TL; DR

如何在Authorize属性中添加其他逻辑,以根据JWT(也许是JwtBearerAuthenticationOptions)中的特定声明检查数据库表?

长版本...

生成JWT并在对包含Authorization标头的控制器发出请求时对其进行验证也可以正常工作。

基本上,该文章不涉及的是撤销...

经过大量的搜索,我发现有几种方法可以处理JWT的吊销。

我选择了“白名单”路由,因此创建了一个表来存储UserId,ClientId(受众群体)和包含JTI值(GUID)的列。

基本上,我想在[Authorize]属性中添加其他逻辑,以便也在此表中检查给定User和ClientId的匹配JTI ...

做到这一点而不必编写自定义的'JWTAuthorize'属性,因为我很想使用默认值...

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

干杯!

1 个答案:

答案 0 :(得分:0)

我已经成功地通过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);
        }
    }

然后,我在客户端处理错误,以确定将用户重定向到何处...

如果有人有更好的建议,我希望看到他们:)