如何延长ServiceStack认证如何延长ServiceStack认证(How can I ext

2019-06-02 14:02发布

我使用ServiceStack认证与ServiceStack.OrmLite(SqlServer的)。 我有不同的用户类型,如学生,教师,校长与其他数据库表。所有用户类型都会有关系。 什么是实现它的最佳做法是什么?

A)中添加必要的字段USERAUTH表,使黑色魔术(后USERAUTH的创作需要添加额外的信息表手动)

B)学生:USERAUTH(在USERAUTH所有字段将被克隆)

C)Student.UserAuthId,UserAuth.Meta [UserType.Student,StudentId]互参考

d)扩展Xservice的,XFeature或??

PS:如何添加所有者和类型,以ServiceStack USERAUTH表中的字段。

Answer 1:

有一对夫妇的策略,以额外的元数据附加到USERAUTHUserAuthDetails表,

如果你想扩展的架构USERAUTH你自定义的POCO的,你需要继承OrmLiteAuthRepository<T,T>类包括自订POCO的,例如请参阅源OrmLiteAuthRepository :

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

扩展UserAuthSession用自己的类型化的自定义会话

在延伸并且提供一个类型化的同时,定制AuthUserSession是推荐的方法,因为它是由支持ServiceStack的 身份验证功能 ,因为会议只是获取一个blobbed的用户缓存提供者 (即未在RDBMS),其中它的模式少持久性的特点,很容易支持扩展类型。

添加额外的元数据到元词典字段

对于轻微的扩展,您可以使用,在其上特意加入到支持自定义持有的元数据的每个表串词典领域。 它们还包括有用Get<T>Set<T>方法,其还支持玷污复杂类型:

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

链接与REFID和RefIdStr领域参考数据

UserAuthUserAuthDetails表还包括一个int? RefId int? RefIdstring RefIdStr你可以用它来引用类似的针对每个用户验证记录或用户的OAuth注册自己的自定义表的外部数据的字段。

提取USERAUTH信息到您自己的自定义表

另一种选择是做什么的SocialBootstrapApi实例演示在做什么,通过覆盖在自己的自定义UserSession的OnAuthenticated挂钩,获得每次在用户成功验证的时间称为提取USERAUTH信息到自己的自定义表。

这里的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);
        }
    }
}


文章来源: How can I extend ServiceStack Authentication