Я следил за этой статьей, чтобы получить 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, а также для его проверки при запуске запроса к контроллеру, включая заголовок авторизации ...
По сути, в статье не идет речь об отзыве ...
После долгих поисков в Google я вижу, что есть несколько способов обработки отзыва с помощью JWT.
Я выбрал маршрут «Белый список» и создал таблицу для хранения UserId, ClientId (Audience) и столбца, содержащего значение JTI (GUID).
По сути, я хочу добавить дополнительную логику к атрибуту [Authorize], чтобы также проверить эту таблицу на соответствие JTI для данного User и ClientId ...
Возможно ли это без необходимости писать собственный атрибут 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);
}
}
Затем я обрабатываю ошибку на стороне клиента, чтобы решить, куда перенаправить пользователя и т. д.
Если у кого-то есть предложения получше, я бы с удовольствием их увидел :)