Вопрос по authentication, servicestack – Как я могу продлить аутентификацию ServiceStack

18

Я использую аутентификацию ServiceStack с ServiceStack.OrmLite (SqlServer). У меня есть разные типы пользователей, такие как ученик, учитель, директор. Все типы пользователей будут связаны с другими таблицами базы данных. Какова лучшая практика для ее реализации?

A) Добавьте необходимые поля в таблицу UserAuth и создайте Black Magic. (После создания UserAuth добавьте необходимую дополнительную информацию в таблицу вручную).

B) Student: UserAuth (все поля в UserAuth будут клонированы)

C) взаимная ссылка Student.UserAuthId, UserAuth.Meta [UserType.Student, StudentId]

D) Расширить XService, XFeature или ??

PS: Как насчет добавления полей Владелец и Тип в таблицу ServiceStack UserAuth.

Ваш Ответ

1   ответ
25

Существует несколько стратегий добавления дополнительных метаданных кUserAuth а такжеUserAuthDetails столы,

Если вы хотите расширить схемуUSERAUTH с вашими собственными POCO-ами, которые вы должны создать в подклассеOrmLiteAuthRepository<T,T> класс, включая ваши пользовательские POCO, например, см. источник дляOrmLiteAuthRepository:

public class OrmLiteAuthRepository 
    : OrmLiteAuthRepository<UserAuth, UserAuthDetails>, IUserAuthRepository
{
    public OrmLiteAuthRepository(IDbConnectionFactory dbFactory) 
        : base(dbFactory) { }
}

Extend UserAuthSession with your own typed Custom Session

В то же время расширение и предоставление типизированных, пользовательскихAuthUserSession рекомендуемый подход, так как он поддерживаетсяServiceStack & APOS; s Функция аутентификации так как сессия пользователей просто получает кляксу вПоставщик кэширования (то есть не в СУБД), где его характеристики персистентности без схемы легко поддерживают расширенные типы.

Adding additional metadata to the Meta dictionary fields

Для небольших расширений вы можете использоватьMeta Поля строковых словарей в каждой таблице, которые были добавлены специально для поддержки пользовательских метаданных. Они также включают в себя полезныеGet<T> а такжеSet<T> методы, которые также поддерживают блобирование сложных типов:

userAuth.Set(new Address { ... });
var address = userAuth.Get<Address>();

Linking referential data with RefId and RefIdStr fields

UserAuth а такжеUserAuthDetails таблицы также включаютint? RefId иstring RefIdStr поля, которые вы можете использовать для ссылки на внешние данные, такие как ваши собственные пользовательские таблицы, на каждую запись аутентификации пользователя или регистрацию пользователя OAuth.

Extracting UserAuth info into your own custom tables

Другой вариант - сделать то, чтоSocialBootstrapApi пример демо делает и извлекает информацию UserAuth в свои собственные таблицы, переопределяяOnAuthenticated подключите свой собственный пользовательский сеанс, который вызывается каждый раз, когда пользователь успешно проходит аутентификацию.

ЗдесьПример SocialBootstrapApi скопировать данные сеанса в пользовательский POCO и сохранить их в другой таблице.

public class CustomUserSession : AuthUserSession
{
    public string CustomId { get; set; }

    public override void OnAuthenticated(IServiceBase authService, IAuthSession session, 
        IAuthTokens tokens, Dictionary<string, string> authInfo)
    {
        base.OnAuthenticated(authService, session, tokens, authInfo);

        //Populate all matching fields from this session to your own custom User table
        var user = session.TranslateTo<User>();
        user.Id = int.Parse(session.UserAuthId);
        user.GravatarImageUrl64 = !session.Email.IsNullOrEmpty()
            ? CreateGravatarUrl(session.Email, 64)
            : null;

        //Resolve the DbFactory from the IOC and persist the user info
        using (var db = authService.TryResolve<IDbConnectionFactory>().Open())
        {
            db.Save(user);
        }
    }
}
Я планировал написать свой собственный (SessionFeature, AuthFeature, RegistrationFeature). Но это так дорого. Я буду использовать ServiceAtack's UserAuth для этого проекта и его мета-поле. ozz
@mythz Я знаю, что это старый ответ, но быстрый вопрос. В чем разница междуUserAuth а такжеUserAuthDetails, если я хочу добавить расширение пользовательской таблицы, мне нужно добавить одинаковые дополнительные свойства для обоих?
@JMK Это отношение «1 ко многим», где UserAuth = объединенная / сводная информация о пользователе, а UserAuthDetails = данные для входа в систему для одного поставщика OAuth (например, twitter, facebook и т. Д.). Вам не нужно расширять обе таблицы.
@mythz Хорошо, спасибо за ответ
Я немного углубился в исследование. Перекрытие OrmLiteAuthRepository кажется более эффективным. Потому что я могу создавать или обновлять как UserAuth, так и свои собственные таблицы транзакциями. В socialbootstrap, когда клиент регистрируется, UserAuth создается, а User нет. Пользователь создан через & quot; Войти & quot ;. Что вы предлагаете: пишу ли я свой собственный OrmLiteAuthRepository или расширяю ServiceStack. (Если ответ «расширить», сделайте методы Virtual :)) ozz

Похожие вопросы