我怎样才能扩展ServiceStack身份validation

我正在使用ServiceStack身份validation与ServiceStack.OrmLite(SqlServer)。 我有不同的用户types,如学生,教师,校长等。所有用户types都将与其他数据库表有关系。 实施它的最佳做法是什么?

A)添加必要的字段到UserAuth表格并制作Black Magic(在创buildUserAuth之后,手动为表格添加必要的额外信息)

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

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

D)扩展XService,XFeature或??

PS:如何将业主和types字段添加到ServiceStack UserAuth表。

有几个策略将额外的元数据附加到UserAuthUserAuthDetails表,

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

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

用您自己的types自定义会话扩展UserAuthSession

同时扩展和提供一个types化的自定义AuthUserSession是推荐的方法,因为它受到ServiceStack的 authenticationfunction的支持,因为用户会话只是在caching提供者 (即不在RDBMS中)中被blobbed的地方,支持扩展types。

将其他元数据添加到Meta字典字段

对于次要扩展,您可以使用每个表格上的string字典字段,这些字段专门添加以支持自定义元数据。 它们还包括有用的Get<T>Set<T>方法,它们也支持blobbing复杂types:

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

将参考数据与RefId和RefIdStr字段链接起来

UserAuthUserOAuthProvider表还包含一个int? RefId int? RefId和一个string RefIdStr字段,您可以使用string RefIdStr字段来引用外部数据,如针对每个用户身份validationlogging或用户OAuth注册的自定义表。

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

另一个选项是做SocialBootstrapApi示例演示 ,通过重写自定义的UserSession中的OnAuthenticated挂钩,将UserAuth信息提取到自定义表中,每次用户成功进行身份validation时都会调用该方法。

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

 public class CustomUserSession : AuthUserSession { public string CustomId { get; set; } public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens 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 authService.TryResolve<IDbConnectionFactory>().Exec(dbCmd => dbCmd.Save(user)); } } 
Interesting Posts