Я использовал 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).
Заранее спасибо!