如何扩展ServiceStack身份验证

ozz*_*ozz 18 authentication servicestack

我正在使用ServiceStack身份验证和ServiceStack.OrmLite(SqlServer).我有不同的用户类型,如学生,教师,校长.所有用户类型将与其他Db表有关系.实施它的最佳做法是什么?

A)向UserAuth表添加必要的字段并制作Black Magic.(创建UserAuth后,手动向表中添加必要的额外信息)

B)学生:UserAuth(将克隆UserAuth中的所有字段)

C)Student.UserAuthId,UserAuth.Meta [UserType.Student,StudentId]互引用

D)扩展XService,XFeature或??

PS:如何将所有者和类型字段添加到ServiceStack UserAuth表.

myt*_*thz 25

有几种策略可以将附加元数据附加到UserAuthUserAuthDetails表,

如果你想用你自己的自定义POCO 扩展UserAuth的模式,你需要继承OrmLiteAuthRepository<T,T>类,包括你的自定义POCO,例如,参见OrmLiteAuthRepository的源代码:

public class OrmLiteAuthRepository 
    : OrmLiteAuthRepository<UserAuth, UserAuthDetails>, IUserAuthRepository
{
    public OrmLiteAuthRepository(IDbConnectionFactory dbFactory) 
        : base(dbFactory) { }
}
Run Code Online (Sandbox Code Playgroud)

使用您自己键入的自定义会话扩展UserAuthSession

同时扩展和提供类型化的自定义AuthUserSessionServiceStack的 身份验证功能所支持的推荐方法,因为用户会话刚刚在缓存提供程序(即不在RDBMS中)中被填充,其中无模式持久性特征,很容易支持扩展类型.

向Meta词典字段添加其他元数据

对于次要扩展,您可以使用每个表上的字符串字典字段,这些字段是专门为支持自定义元数据而添加的.它们还包括有用的方法Get<T>Set<T>支持blobbing复杂类型的方法:

userAuth.Set(new Address { ... });
var address = userAuth.Get<Address>();
Run Code Online (Sandbox Code Playgroud)

将引用数据与RefId和RefIdStr字段链接

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

将UserAuth信息提取到您自己的自定义表中

另一种选择是执行SocialBootstrapApi示例演示正在执行的操作,并通过覆盖您自己的自定义UserSession中的OnAuthenticated挂钩将UserAuth信息提取到您自己的自定义表中,每次用户成功进行身份验证时都会调用它.

以下是将会话数据复制到自定义用户POCO并将其保存在其他表中的SocialBootstrapApi示例.

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我已经深入调查了一下.Orrriding OrmLiteAuthRepository似乎更有效.因为我可以事务性地创建或更新UserAuth和我自己的表.在socialbootstrap中,当客户端注册时,会创建UserAuth但不会创建User.用户通过"登录"创建.你有什么建议:我自己编写OrmLiteAuthRepository还是扩展ServiceStack.(如果答案是"延伸"请制作方法虚拟:)) (5认同)