servicestack,Authentication,servicestack" /> servicestack,Authentication,servicestack" />

Authentication 如何实施";“记住我”;使用ServiceStack身份验证

Authentication 如何实施";“记住我”;使用ServiceStack身份验证,authentication,servicestack,Authentication,servicestack,我正在尝试在基于ServiceStack的项目中实现“记住我”功能。我不想使用基本身份验证,因为它需要在浏览器cookie中以明文形式存储密码,所以我需要想出一种替代方法,该方法将易于维护,并可根据我现有的数据库进行自定义 我知道ServiceStack自己对记住我的支持是基于在服务器端缓存中缓存IAuthSession实例,默认情况下,这是一个内存中的数据结构,在网站重新启动时会被清除(不好)。或者,缓存也可以基于Redis或Memcached,这更好(缓存的数据在网站重新启动后仍然有效),但

我正在尝试在基于ServiceStack的项目中实现“记住我”功能。我不想使用基本身份验证,因为它需要在浏览器cookie中以明文形式存储密码,所以我需要想出一种替代方法,该方法将易于维护,并可根据我现有的数据库进行自定义

我知道ServiceStack自己对记住我的支持是基于在服务器端缓存中缓存
IAuthSession
实例,默认情况下,这是一个内存中的数据结构,在网站重新启动时会被清除(不好)。或者,缓存也可以基于Redis或Memcached,这更好(缓存的数据在网站重新启动后仍然有效),但会向图片中添加比我想添加的更多的运动部分

相反,我希望使用我自己的数据库实现此功能:

用户

  • 用户标识(自动递增标识)
  • 用户名
  • 密码
  • 电子邮件
  • 名字
  • 等等
会话

  • SessionID(自动递增标识)
  • 用户ID(FK到用户)
  • 起始日期
  • 结束日期时间
  • 会话密钥(GUID)
我认为事情是这样的:

根据登录请求,
AuthService
创建my
UserAuthSession
类的空实例(实现
iaAuthSession
)并调用my custom credentials provider的
tryaAuthenticate
方法,该方法根据Users表对用户进行身份验证,使用相关用户数据填充
UserAuthSession
,并将新记录插入会话表

然后,验证会话缓存在内存缓存中,并创建ServiceStack会话cookie(
ss id
ss pid
)并将其发送到浏览器

如果用户选中“记住我”,则我的自定义凭据提供程序的
OnAuthenticate
方法会创建一个永久登录cookie,其中包含用户的用户名和自动生成的会话。SessionKey。此cookie将帮助我们跟踪后续访问中的用户,即使身份验证会话不再在缓存中

现在,假设站点已重新启动,缓存已不存在,因此当用户返回站点时,他的身份验证会话将无处可寻。
AuthenticateAttribute
中的当前逻辑将用户重定向回登录屏幕,但我想更改流程,以便尝试根据我的自定义登录cookie识别用户,即:

  • 查找从登录cookie中提取的用户名的最新会话记录
  • 检查其SessionKey是否与登录cookie中的密钥匹配
  • 如果匹配,则:
    • 从用户表中读取用户的数据
    • 创建我的自定义身份验证会话实例,用用户数据填充并缓存它(就像初始登录时一样)
    • 插入具有新SessionKey值的新会话记录
    • 将下次使用的新登录cookie发送回浏览器
  • 如果密钥不匹配,则将用户发送回登录屏幕
  • 上述逻辑有意义吗

    是否有人已经使用ServiceStack实现了类似的功能


    如果我继续使用这种方法,那么不需要创建自己的
    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即可。