分布式认证

Den*_*kic 5 rest distributed-system node.js servicestack

我想实现一个特定的架构,将我的 rest API 与 Web 服务器分离,该 Web 服务器将用作不可知的模板引擎,例如 DustJS。我的后端休息 API 将使用服务堆栈构建。

我喜欢服务堆栈和 NodeJS 的主要方面是它们都提供了一种身份验证方式,但我只需要一种中央方式来访问凭证,以授予对 API 调用的访问权限以及限制我的视图中的某些内容。

我想开发的应用程序是一个基于订阅的约会网站,所以这给我带来了一些问题。涉及的参数是角色、组、身份验证和授权。在服务堆栈上实现很容易,但我主要对前端如何访问该信息感到困惑。

我将如何实现前端检索凭据一次并且不必继续进行 API 调用来检查数据库或缓存以查看它是否已检出的场景?我是否需要实施不同的方法来处理希望保持登录状态的客户端,或者通常仅通过设置时间戳值就可以解决这个问题?

谢谢大家的时间。

myt*_*thz 2

会话只是存储在缓存中的 AuthUserSession POCO

身份验证在 ServiceStack(和大多数 Web 框架)中的工作方式是,当用户成功进行身份验证时,将为该用户创建一个经过身份验证的 UserSession ,并将其存储在您在 ServiceStack 的 AppHost 中注册的已注册缓存提供程序中。然后,经过身份验证的 UserSession(又名AuthUserSession)的会话 ID 存储在ss-id 临时 cookie 和 ss-pid 永久cookie 下的用户 cookie 中。

每次请求时重新发送会话 Cookie

根据设计,每次后续请求都会重新发送到该域的 Cookie,这就是服务器框架通过简单地从存储在以下密钥下的缓存提供程序中检索 AuthUserSession 来了解哪个经过身份验证的用户正在发出每个请求:

urn:iauthsession:{sessionId}
Run Code Online (Sandbox Code Playgroud)

临时 (ss-id) 或永久 (ss-pid) cookie 的位置{sessionId}取决于用户是否通过身份验证?RememberMe=true。这也意味着您的节点服务器还可以通过使用上述密钥格式访问相同的缓存来轻松访问通过 ServiceStack 进行身份验证的用户会话。

大多数缓存提供者都是分布式的

除(默认)之外的所有缓存提供程序MemoryCacheClient都是分布式的,这意味着每个负载平衡的应用程序服务器自然能够判断用户是否已通过身份验证。

访问用户会话非常便宜

我不会关心检索 UserSession 的性能,因为访问用户会话只需要一次缓存命中即可通过单个密钥访问 blob 的用户会话 - 这最接近服务器可以执行的最便宜的网络请求。

可以使用直写式缓存避免网络请求

避免检索用户会话的单个缓存请求的一种方法是使用直写式缓存,其中当用户经过身份验证时,它会保存在本地MemoryCacheClient以及分布式ICacheClient(例如 Redis)中,这样当请求请求用户会话时,它首先查看本地缓存,如果不存在,将调用分布式缓存来获取它,然后将其存储在本地缓存中,然后返回。您需要注意的一件事是将分布式缓存的任何更改与存储在所有负载平衡应用程序服务器内存中的本地缓存同步,您可以使用Redis Pub/Sub之类的工具在所有应用程序服务器之间发送消息。不同的应用程序服务器。