WedX - журнал о программировании и компьютерных науках

Действия после регистрации в ServiceStack

Я использовал ServiceStack для нескольких проектов, и мне это очень нравится. Тем не менее, это мой первый опыт работы с аутентификацией пользователей, так что простите меня, если я делаю здесь какие-либо фундаментальные ошибки в своем понимании или реализации.

Мне нужно иметь возможность отслеживать настраиваемые свойства пользователей, такие как их тип пользователя и компания, с которой они связаны. Для этого я создал отдельный класс «Пользователь», который содержит только сведения о пользователе, которого я хочу отслеживать, а также пользовательские биты. Мне это нравится, потому что, например, я могу сохранить UserTypeId как свойство пользователя и [Reference] фактический объект UserType. Это позволяет мне отправить эти вложенные данные обратно клиенту, используя LoadReferences в другом месте кода службы.

Чтобы сделать что-либо из этого, мне нужно получить пользовательский объект User для отправки обратно в браузер (это веб-приложение). До сих пор я реализовал CustomCredentialsAuthProvider, который добавляет объект User в AuthResponse следующим образом:

public override object Authenticate(IServiceBase authService, IAuthSession session, Authenticate request)
    {
        //let normal authentication happen
        var authResponse = (AuthenticateResponse)base.Authenticate(authService, session, request);

        using (var db = authService.TryResolve<IDbConnectionFactory>().OpenDbConnection())
        {
            User user = db.LoadSingleById<User>(int.Parse(authResponse.UserId));

            //return your own class, but take neccessary data from AuthResponse
            return new
            {
                SessionId = authResponse.SessionId,
                ReferrerUrl = authResponse.ReferrerUrl,
                ResponseStatus = authResponse.ResponseStatus,
                UserSession = user
            };
        }
    }

Это хорошо работает. Чтобы управлять профилями пользователей в приложении, я публикую все необходимые обновления, которые записываются как в таблицу User, так и в IUserAuthRepository (оба используют текущий сеанс UserAuthId в качестве ключа).

Хорошо, это все основы. Что мне нужно сделать сейчас, если это возможно, так это позволить пользователю A зарегистрировать другого пользователя B, не переключая их сеанс на пользователя B. Насколько я могу судить, метод Register возвращает только только что созданный идентификатор пользователя...

{"userId":"1019","responseStatus":{}}

... а также устанавливает файл cookie сеанса для вновь созданного сеанса пользователя. Я предполагаю, что мне нужен способ предотвратить это автоматическое назначение сеанса и иметь возможность просто регистрировать новых пользователей и получать их идентификатор независимо от чего-либо еще. Это возможно?

В связи с этим я хотел бы иметь возможность получить весь профиль пользователя сразу после регистрации, а не только «userId». В настоящее время мне нужно сделать еще один вызов сервера, чтобы получить сведения о пользователе (полученные от пользователя на основе session.UserAuthId).

Заранее спасибо!

12.03.2015

Ответы:


1

Настройка ответа службы аутентификации

Я бы порекомендовал вам всегда возвращать конкретный класс в ServiceStack Services (т. е. вместо анонимного объекта), это помогает создавать службы метаданных для типов DTO и позволяет десериализовать ответ в типизированных API.

Вам также следует рассмотреть возможность соблюдения контракта на обслуживание Authenticate (которого ожидают все клиенты) и продолжать возвращать тип AuthenticateResponse. Вы можете использовать свойство Dictionary<string,string> Meta, чтобы прикрепить дополнительные метаданные к возвращаемому типу, например:

var r = (AuthenticateResponse)base.Authenticate(authService, session, request);

using (var db = authService.TryResolve<IDbConnectionFactory>().Open())
{
    User user = db.LoadSingleById<User>(int.Parse(r.UserId));

    r.Meta = new Dictionary<String,String> {
        {"customId", user.CustomId},
        //etc
    };

    return r;
}

Ваша служба по-прежнему будет работать, если вы решите вернуть другой тип, но таким образом она не нарушит работу клиентов службы .NET, ожидающих получения типизированного AuthenticateResponse.

Реализация пользовательской регистрации

Для пользовательской регистрации вместо использования существующей RegisterService Скопируйте реализацию и создайте свою версию, которая делает то, что вы хотите.

Службы регистрации используют зависимость IAuthRepository для создания новых пользователей:

public IAuthRepository AuthRepo { get; set; }

Который он приводит к IUserAuthRepository, поэтому он может получить доступ к более богатым API, например:

var userAuthRepo = AuthRepo.AsUserAuthRepository(GetResolver());

Здесь вы можете зарегистрировать нового пользователя, заполнив экземпляр UserAuth, например:

var newUserAuth = request.ConvertTo<UserAuth>();
newUserAuth.PrimaryEmail = request.Email;

Который вы можете использовать для создания нового пользователя с помощью:

userAuthRepo.CreateUserAuth(newUserAuth, request.Password)

Что просто сохраняет новую информацию UserAuth в зарегистрированном файле IUserAuthRepository.

Поскольку теперь вы используете свою собственную реализацию класса Register, это не повлияет на вашу существующую сессию, и вы можете вернуть любой ответ, который вам нравится.

13.03.2015
  • Это заставило меня пойти по правильному пути. Я реализовал службу CustomRegistration, которая позволяет мне делать обе вещи, которые мне нужны: 1) позволить пользователю зарегистрироваться, автоматически войти в систему и вернуть пользовательский объект пользователя в ответ, и 2) разрешить пользователю зарегистрировать кого-то еще и просто получить верните пользовательский идентификатор пользователя и отображаемое имя. Работает отлично. 17.03.2015
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]