Подтвердить что ты не робот

Как продлить проверку подлинности ServiceStack

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

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

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

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

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

PS: Как добавить поля Owner и Type в таблицу UserAuth ServiceStack.

4b9b3361

Ответ 1

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

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

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

Расширить UserAuthSession с помощью собственного пользовательского сеанса

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

Добавление дополнительных метаданных в поля метаданных

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

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

Связывание референтных данных с полями RefId и RefIdStr

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

Извлечение информации UserAuth в ваши собственные таблицы

Другой вариант - сделать то, что делает демонстрационный пример 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);
        }
    }
}