分布式validation

我想实现一个特定的体系结构,将我的rest API从一个Web服务器中分离出来,这个Web服务器将被用作一个不可知的模板引擎,比如DustJS。 我的后端restAPI将使用服务堆栈来构build。

我最喜欢的服务堆栈和NodeJS是他们都提供了一种身份validation的方式,但我只需要一个中央的方式来访问凭据授予访问API调用,以及限制我的意见的某些内容。

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

我将如何实现一个场景,即前端只需检索一次凭据,而不必继续通过API调用来检查数据库或caching以查看是否检出? 我是否需要在处理希望保持login状态的客户端时采用不同的方法,或者通过设置时间戳值来解决问题?

感谢你的时间每个人。

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

authentication在ServiceStack(以及大多数Web框架)中的工作方式是,当用户成功authentication时,为该用户创build一个Authenticated UserSession ,并将其存储在您在ServiceStack的AppHost中注册的注册caching提供程序中。 Authenticated UserSession(aka AuthUserSession )的会话ID然后存储在ssl -id Temporary和ss-pid永久性 cookie下的Users cookie中。

会话Cookie在每个请求中重新发送

devisecookies被重新发送到该域的每个后续请求,这是服务器框架如何知道哪些经过身份validation的用户通过简单地检索存储在下面的密钥下的caching提供程序的AuthUserSession进行每个请求:

urn:iauthsession:{sessionId} 

其中{sessionId}是临时(ss-id)或永久(ss-pid)cookie,具体取决于用户是否使用?RememberMe=true身份validation。 这也意味着您的节点服务器也可以通过使用上述密钥格式访问相同的caching,轻松访问通过ServiceStackvalidation的用户会话。

大多数caching提供者是分布式的

除了MemoryCacheClient (默认)以外的所有caching提供程序都是分发的,这意味着每个负载平衡的应用程序服务器都自然能够分辨用户是否已通过身份validation。

访问用户会话非常便宜

我不关心检索UserSession的性能,因为访问一个用户会话只需要一个caching命中来访问在一个密钥上的blobbed用户会话 – 这是最接近你的服务器可以做到的最便宜的networking请求。

可以通过Write-thru Cache来避免networking请求

您可以避免单个caching请求检索用户会话的一种方法是使用直写式caching,其中当用户通过身份validation时,它将保存在本地MemoryCacheClient以及分布式ICacheClient (例如Redis)中,当请求对于用户会话请求,它首先查看本地caching,如果不存在,则会调用分布式caching来获取它,并在返回之前将其存储在本地caching中。 您需要注意的一件事是将分布式caching的任何更改与存储在所有负载平衡应用服务器的内存中的本地caching同步,您可以使用类似Redis Pub / Sub的内容在所有不同的应用服务器

你必须检查SOMETHING。 您的网站可能会build立与客户端的cookie,每次客户端访问,它可以检查数据库中的cookie是有效的,但这可能是浪费,因为在一个小时内访问该网站的最大独特用户可能是非常比较总的订阅名单,例如说1%。 因此,如果您喜欢这种额外的安全性,您可以拥有一个HASH内存caching,用于检查Cookie会话ID,还可以select使用客户端的IP地址。 因此,使用会话ID和IP(可选)来查找数据,并确保将最后一次访问时间存储在数据中,这样,如果内存caching条目没有被访问时间过长,就可以使其无效,并存储您实际需要的任何其他数据,以实际执行您需要执行的任何操作。

如果您的网站变得很大,并在一个负载均衡的群集中的许多机器上扩展,您可以根据客户端IP对服务器进行负载均衡,这意味着这个caching不会变得不必要的大,因为通常给定的客户端将会去同一个服务器,切换它的罚款,因为您的Web应用程序可以回落到从数据库加载。

从我所了解的情况来看, JWT将会解决你的问题。 由于JWT令牌不是不透明的,因此您可以在本地进行任何types的validation,而无需检查中央会话服务。

这不是太直截了当,而是简单的说:“它解决了我们所有的会议问题”

Auth0提供了很多好的读取。 从这里开始

Interesting Posts