Проверка таблицы «белого списка» во время атрибута [Authorize] (JWT веб-API ASP.Net MVC5) - PullRequest
0 голосов
/ 30 августа 2018

Я следовал этой статье, чтобы получать JWT из .Net Web API http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/

TL; DR

Как добавить дополнительную логику в атрибут Authorize, чтобы сравнить таблицу базы данных с конкретными утверждениями в JWT, возможно, в JwtBearerAuthenticationOptions?

Более длинная версия ...

Он прекрасно работает для генерации JWT, а также для проверки его при отправке запроса к контроллеру, включая заголовок авторизации ...

По сути, статья не раскрывается в отзыве ...

После долгих поисков я вижу, что есть несколько способов обработки Revocation с помощью JWT.

Я выбрал маршрут «Белый список» и поэтому создал таблицу для хранения UserId, ClientId (Audience) и столбца, содержащего значение JTI (GUID).

По сути, я хочу добавить дополнительную логику к атрибуту [Authorize], чтобы также проверить эту таблицу на соответствие JTI для данного пользователя и ClientId ...

Это выполнимо без необходимости писать собственный атрибут 'JWTAuthorize', поскольку я бы очень хотел использовать значение по умолчанию ...

Я подозреваю, что это необходимо указать в JwtBearerAuthenticationOptions?

Ура!

1 Ответ

0 голосов
/ 04 сентября 2018

Мне удалось заставить это работать с помощью специального провайдера на 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);
        }
    }

Затем я обрабатываю ошибку на стороне клиента, чтобы решить, куда перенаправить пользователя и т. Д. *

Если у кого-нибудь есть предложения получше, я бы с удовольствием их увидел:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...