Доступ к полезной нагрузке в токене JWT в атрибутах фильтра запросов и откликов служб - PullRequest
1 голос
/ 25 апреля 2019

Я программирую Сервис и ПО ERP с помощью API, основанного на Servicetack. В атрибуте фильтра запросов я хочу проверить, имеет ли текущий пользователь разрешение на использование определенной службы, оценивая ACL данной службы. В атрибуте фильтра ответов я хочу отфильтровать результат службы.

Справочная информация: в моей компании есть пользователи, которые имеют доступ ко всем клиентам и их данным. Тогда у меня есть пользователи, которые принадлежат клиенту, и эти пользователи могут видеть только данные своей компании. Поэтому сначала я должен оценить, имеет ли пользователь доступ к запрошенной услуге (CRUD), и если да, то мне нужно определить, какие из результирующих данных пользователь может фактически увидеть в пользовательском интерфейсе.

Я заполнил свой JWT так:

{
  "iat": 1556223131,
  "exp": 1557432731,
  "preferred_username": "sa",
  "cwp_pid": "people/97-A",
  "cwp_bpid": "geschaeftspartners/481-A",
  "cwp_adm": "True",
  "cwp_su": "True"
}

В этих атрибутах фильтра мне нужен доступ к моим утверждениям cwp_ для запуска моего фильтра откликов, а в фильтре запросов мне нужен доступ к cwp_pid (идентификатор пользователя).

1 Ответ

1 голос
/ 26 апреля 2019

Если вы используете поставщик аутентификации JWT ServiceStack , вы можете получить токен JWT в фильтрах запросов / ответов, используя метод расширения IRequest.GetJwtToken(), например:

GlobalRequestFilters.Add((req, res, dto) => {
    string jwt = req.GetJwtToken();

    var jwtProvider = AuthenticateService.GetRequiredJwtAuthProvider();

    IAuthSession session = jwtProvider.ConvertJwtToSession(req, jwt);                
    JsonObject jwtPayload = jwtProvider.GetVerifiedJwtPayload(req, jwt.Split('.'));
});

Оттуда вы можете преобразовать токен JWT в сеанс пользователя или извлечь полезную нагрузку JSON, как в словаре JsonObject, как показано выше.

...