Servicetack GlobalRequestFilters, заполняющий дополнительные данные аутентификации пользователя в токены Jwt - PullRequest
1 голос
/ 20 января 2020

Я хочу добавить дополнительные свойства в ответ, когда пользователь входит в систему.

При вызове https://Servicestackservice/auth/credentials?userName=**** & password = **** Я получаю ответ ниже , Я хочу добавить 2 дополнительных значения. DateFormat & TimeZone

{"userId": "21", "sessionId": "****", "userName": "SystemAdmin", "displayName": "System Admin", "referrerUrl": null, "bearerToken": "****", "refreshToken": * "," profileUrl ": *", "role": [View], "permissions": [View], " responseStatus ": {" errorCode ": null," message ": null," stackTrace ": null," errors ": null," meta ": null}," meta ": null}

Я нашел пример на форумах SS. Мне пришлось изменить его, чтобы он запустился.

Из документов SS

Modifying the Payload

Хотя в полезную нагрузку по умолчанию встроена только ограниченная информация, все соответствующие свойства AuthUserSession, встроенные в токен, также будут быть заполненным в сеансе , который можно добавить к полезной нагрузке с помощью делегата CreatePayloadFilter. Поэтому, если вы также хотите иметь доступ к моменту регистрации пользователя, вы можете добавить его в полезную нагрузку с помощью:

Я надеюсь, что именно так я получу их в " совпадающем AuthUserSession "

          this.GlobalRequestFilters.Add(async (req, res, requestDto) =>
            {
                AuthFilter.AuthResponse(req, res, requestDto);
            });

        public static void AuthResponse(IRequest req, IResponse res, object response)
    {
        var authRes = response as Authenticate;
        if (authRes == null || authRes.UserName == null)
        {
            return;
        }
        var session = (CustomUserSession)req.GetSession();
        if (session != null && session.UserAuthId != null)
        {
            //General Format for US
            string dformat = "g";
            using (var db = HostContext.TryResolve<IDbConnectionFactory>().Open())
            {
                var userAuthExt = db.Single<UserAuthExtension>(ext => ext.UserAuthId == int.Parse(session.UserAuthId));
                if (userAuthExt != null)
                {
                    dformat = userAuthExt.DateTimeFormat;
                }
            }

            authRes.Meta = new Dictionary<string, string> {{"TimeZone", session.TimeZone}, {"DateFormat", dformat}};
        }
    }

Добавление этого, чтобы попытаться получить токены JWT для хранения новых данных. Изучив полезную нагрузку, я вижу, что в список добавлено 2 новых значения.

   new JwtAuthProvider(AppSettings)
                    {
                        CreatePayloadFilter = (payload, session) =>
                        {

                            if (session != null && session.UserAuthId != null)
                            {
                                //General Format for US
                                string dformat = "g";
                                using (var db = HostContext.TryResolve<IDbConnectionFactory>().Open())
                                {
                                    var userAuthExt = db.Single<UserAuthExtension>(ext => ext.UserAuthId == int.Parse(session.UserAuthId));
                                    if (userAuthExt != null)
                                    {
                                        dformat = userAuthExt.DateTimeFormat;
                                    }
                                }

                                payload["TimeZone"] = ((AuthUserSession) session).TimeZone;
                                payload["DateFormat"] = dformat;
                            }
                        },

1 Ответ

1 голос
/ 20 января 2020

Вам следует сослаться на документы, на которые вы ссылаетесь, и я считаю, что это ServiceStack's JWT , изменяющий полезную документацию . Хотя неясно, на какой пример на форумах клиентов вы ссылаетесь.

Также неясно, в чем вопрос, но я предполагаю, что это утверждение:

При вызове / auth / credentials? UserName = **** & password = **** Я не вижу новых значений.

Где именно вы ожидаете эти значения? Если вы выполняете аутентификацию с помощью учетных данных, вы не проходите аутентификацию с помощью JWT, поэтому у вас не будет этих дополнительных свойств, заполненных в пользовательской сессии. Если они встроены в полезную нагрузку тела вашего JWT, то, поскольку TimeZone является свойством AuthUserSession, оно должно быть заполнено , если оно содержалось в полезной нагрузке JWT:

case "TimeZone":
    authSession.TimeZone = entry.Value;
    break;

Но DateFormat не является свойством AuthUserSession, поэтому вам нужно заполнить его вручную, предоставив реализацию для PopulateSessionFilter, например:

new JwtAuthProvider(AppSettings) 
{
    PopulateSessionFilter = (session,payload,req) => 
        session.Meta["DateFormat"] = payload["DateFormat"];
}

Но эти свойства заполняются только в сеансе пользователей при аутентификации через JWT.

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

...