gpt4 book ai didi

authentication - 如何使用ServiceStack认证实现 "remember me"

转载 作者:行者123 更新时间:2023-12-02 00:04:51 28 4
gpt4 key购买 nike

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

据我所知,ServiceStack 自身对Remember me 的支持是基于在服务器端缓存中缓存IAuthSession 实例,默认情况下是内存数据结构当网站重新启动时,它会被清除(不好)。或者,缓存也可以基于 Redis 或 Memcached,后者更好(缓存数据在网站重新启动后仍然存在)但增加了比我想添加的更多的动态部分。

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

用户:

  • UserID(自动递增身份)
  • 用户名
  • 密码
  • 电子邮件
  • 姓名
  • 等...

session :

  • SessionID(自增标识)
  • 用户 ID(FK 给用户)
  • 开始日期时间
  • 结束时间
  • session key (GUID)

我看待事情的方式是这样的:

根据登录请求,AuthService 创建我的 UserAuthSession 类的空实例(实现 IAuthSession)并调用我的自定义凭据提供程序的 TryAuthenticate 方法,根据 Users 表对用户进行身份验证,使用相关用户数据填充 UserAuthSession 并将新记录插入到 Session 表。

然后 auth session 被缓存在内存缓存中,ServiceStack session cookie(ss-idss-pid)被创建并发送到浏览器。

如果用户选中记住我,那么我的自定义凭证提供程序的 OnAuthenticate 方法还会创建一个永久登录 cookie,其中包含用户的用户名和自动生成的 session .SessionKey。即使授权 session 不再在缓存中,此 cookie 也将帮助我们在后续访问中跟踪用户。

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

  1. 查找从登录 cookie 中提取的用户名的最新 session 记录
  2. 检查它的 SessionKey 是否与登录 cookie 中的 key 匹配
  3. 如果匹配,则:
    • Users表中读取用户数据
    • 创建我的自定义身份验证 session 实例,用用户数据填充它并缓存它(就像在初始登录时一样)
    • 使用新的 SessionKey 值插入新的 Sessions 记录
    • 向浏览器发回一个新的登录 cookie,以便下次使用
  4. 如果 key 不匹配,则将用户送回登录屏幕。

以上逻辑是否合理?

有没有人已经使用 ServiceStack 实现了类似的东西?

如果我要继续使用这种方法,最好的做法是不涉及创建我自己的 AuthenticateAttribute 自定义版本? IE。我可以使用哪些 Hook 来使用现有的 ServiceStack 代码构建它?

最佳答案

这已经为您打造!只需使用 OrmLiteCacheClient .

在您的 AppHost.Configure() 方法中,添加以下内容:

var dbCacheClient = new OrmLiteCacheClient {
DbFactory = container.Resolve<IDbConnectionFactory>()
};
dbCacheClient.InitSchema();
container.Register<ICacheClient>(dbCacheClient);

我不确定此特定功能是何时添加的,也许您最初询问时它不可用。它至少在 v4.0.31 中可用。

关于authentication - 如何使用ServiceStack认证实现 "remember me",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18993236/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com