【问题标题】:How can I extend ServiceStack Authentication如何扩展 ServiceStack 身份验证
【发布时间】:2012-06-22 11:11:40
【问题描述】:

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

A) 将必要的字段添加到 UserAuth 表并制作 Black Magic。(在创建 UserAuth 后手动将必要的额外信息添加到表中)

B) Student:UserAuth(UserAuth 中的所有字段都将被克隆)

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

D) 扩展 XService、XFeature 或 ??

PS:如何将 Owner 和 Type 字段添加到 ServiceStack UserAuth 表中。

【问题讨论】:

    标签: authentication servicestack


    【解决方案1】:

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

    如果您想用您自己的自定义 POCO 扩展 UserAuth 的架构,您需要子类化 OrmLiteAuthRepository<T,T> 类,包括您的自定义 POCO,例如查看 OrmLiteAuthRepository 的源代码:

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

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

    同时扩展和提供一个类型化的自定义AuthUserSession 是推荐的方法,因为它受到ServiceStack's Authentication Feature 的支持,因为用户会话只是在Caching Provider 中出现(即不在RDBMS 中)它的无模式持久性特性,很容易支持扩展类型。

    向元字典字段添加额外的元数据

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

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

    使用 RefId 和 RefIdStr 字段链接参考数据

    UserAuthUserAuthDetails 表还包括 int? RefIdstring RefIdStr 字段,您可以使用它们来引用外部数据,例如针对每个用户身份验证记录或用户 OAuth 注册的自定义表。

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

    另一种选择是执行SocialBootstrapApi example demo 正在做的事情,并通过覆盖您自己的自定义 UserSession 中的 OnAuthenticated 钩子将 UserAuth 信息提取到您自己的自定义表中,每次用户成功时都会调用该钩子验证。

    这是将会话数据复制到自定义用户 POCO 并将其保存在不同表中的 SocialBootstrapApi example

    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);
            }
        }
    }
    

    【讨论】:

    • 我已经进行了一些深入的调查。覆盖 OrmLiteAuthRepository 似乎更有效。因为我可以事务性地创建或更新 UserAuth 和我自己的表。在 socialbootstrap 中,当客户端注册时,会创建 UserAuth 但不会创建 User。用户是通过“登录”创建的。您的建议是什么:我是编写自己的 OrmLiteAuthRepository 还是扩展 ServiceStack。 (如果答案是“扩展”,请将方法设为虚拟 :))
    • 我打算自己写(SessionFeature、AuthFeature、RegistrationFeature)。但它是如此昂贵。我将为这个项目和它的 Meta 字段使用 ServiceStack 的 UserAuth。
    • @mythz 我知道这是一个旧答案,但问题很快。 UserAuthUserAuthDetails 有什么区别,如果我想添加扩展用户表,是否需要为两者添加相同的额外属性?
    • @JMK 这是一对多的关系,其中 UserAuth = 组合/汇总用户信息,而 UserAuthDetails = 单个 OAuth 提供程序(例如 twitter、facebook 等)的登录详细信息。您不需要扩展这两个表。
    猜你喜欢
    • 2012-05-10
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 2012-07-05
    • 2019-02-06
    • 1970-01-01
    相关资源
    最近更新 更多