Authentication 如何实施";“记住我”;使用ServiceStack身份验证
我正在尝试在基于ServiceStack的项目中实现“记住我”功能。我不想使用基本身份验证,因为它需要在浏览器cookie中以明文形式存储密码,所以我需要想出一种替代方法,该方法将易于维护,并可根据我现有的数据库进行自定义 我知道ServiceStack自己对记住我的支持是基于在服务器端缓存中缓存Authentication 如何实施";“记住我”;使用ServiceStack身份验证,authentication,
servicestack,Authentication,
servicestack,我正在尝试在基于ServiceStack的项目中实现“记住我”功能。我不想使用基本身份验证,因为它需要在浏览器cookie中以明文形式存储密码,所以我需要想出一种替代方法,该方法将易于维护,并可根据我现有的数据库进行自定义 我知道ServiceStack自己对记住我的支持是基于在服务器端缓存中缓存IAuthSession实例,默认情况下,这是一个内存中的数据结构,在网站重新启动时会被清除(不好)。或者,缓存也可以基于Redis或Memcached,这更好(缓存的数据在网站重新启动后仍然有效),但
IAuthSession
实例,默认情况下,这是一个内存中的数据结构,在网站重新启动时会被清除(不好)。或者,缓存也可以基于Redis或Memcached,这更好(缓存的数据在网站重新启动后仍然有效),但会向图片中添加比我想添加的更多的运动部分
相反,我希望使用我自己的数据库实现此功能:
表用户:
- 用户标识(自动递增标识)
- 用户名
- 密码
- 电子邮件
- 名字
- 等等
- SessionID(自动递增标识)
- 用户ID(FK到用户)
- 起始日期
- 结束日期时间
- 会话密钥(GUID)
AuthService
创建myUserAuthSession
类的空实例(实现iaAuthSession
)并调用my custom credentials provider的tryaAuthenticate
方法,该方法根据Users表对用户进行身份验证,使用相关用户数据填充UserAuthSession
,并将新记录插入会话表
然后,验证会话缓存在内存缓存中,并创建ServiceStack会话cookie(ss id
和ss pid
)并将其发送到浏览器
如果用户选中“记住我”,则我的自定义凭据提供程序的OnAuthenticate
方法会创建一个永久登录cookie,其中包含用户的用户名和自动生成的会话。SessionKey。此cookie将帮助我们跟踪后续访问中的用户,即使身份验证会话不再在缓存中
现在,假设站点已重新启动,缓存已不存在,因此当用户返回站点时,他的身份验证会话将无处可寻。AuthenticateAttribute
中的当前逻辑将用户重定向回登录屏幕,但我想更改流程,以便尝试根据我的自定义登录cookie识别用户,即:
- 从用户表中读取用户的数据
- 创建我的自定义身份验证会话实例,用用户数据填充并缓存它(就像初始登录时一样)
- 插入具有新SessionKey值的新会话记录
- 将下次使用的新登录cookie发送回浏览器
如果我继续使用这种方法,那么不需要创建自己的
AuthenticateAttribute
自定义版本的最佳做法是什么?也就是说,我可以使用哪些钩子使用现有的ServiceStack代码来构建它?这已经为您构建了!就用这个
在AppHost.Configure()方法中,添加以下内容:
var dbCacheClient=new或mlitecacheclient{
DbFactory=container.Resolve()
};
dbCacheClient.InitSchema();
container.Register(dbCacheClient);
我不确定这个特定的功能是什么时候添加的,也许在您最初询问时它不可用。它至少在v4.0.31中可用。您对ServiceStack中会话工作方式的假设有很多错误。首先,基本身份验证不会将密码存储在客户端的cookie中,ss pid
是以任何方式创建的永久cookie(但不用于在非永久模式下检索会话密钥)。无论如何,只要使用OrmLiteCacheClient即可。