桥接表单身份验证和OAUTH

桥接表单身份验证和OAUTH,oauth,forms-authentication,thinktecture-ident-model,Oauth,Forms Authentication,Thinktecture Ident Model,修改表单身份验证登录过程并不困难,因此除了正常的表单身份验证之外,WebClient对象还可以对使用Thinktecture IdentityModel设置的Web api DAL提供的api/令牌url进行基本身份验证。然后,返回的会话令牌可以存储在会话字典中,以便以后调用DAL时使用 问题是这些代币的寿命不同 我可以重写应用程序,将凭据保存在localStorage中,以便在需要时重新创建会话令牌时使用,但从安全角度来看,这很难看,也不理想 可能有一些方法可以为一个或两个系统配置令牌耐久性,

修改表单身份验证登录过程并不困难,因此除了正常的表单身份验证之外,WebClient对象还可以对使用Thinktecture IdentityModel设置的Web api DAL提供的api/令牌url进行基本身份验证。然后,返回的会话令牌可以存储在会话字典中,以便以后调用DAL时使用

问题是这些代币的寿命不同

我可以重写应用程序,将凭据保存在localStorage中,以便在需要时重新创建会话令牌时使用,但从安全角度来看,这很难看,也不理想

可能有一些方法可以为一个或两个系统配置令牌耐久性,但我不知道使用什么搜索词(我尝试搜索令牌耐久性和令牌寿命,但结果没有帮助)

我对如何最好地协调这两种web应用程序安全性的哲学和实用建议都感兴趣。如果这个话题还没有答案,我会非常惊讶,如果我知道该搜索什么的话


有点背景,因为有些人不清楚我在问什么

有一个非常丑陋的老式ASP.NET web应用程序,它使用基于表单的安全性

我刚刚添加了一些新东西,作为一个单独的DAL应用程序,它使用ThinktectureIdentityModel。此DAL由两个应用程序使用,ASP.NET应用程序和Durandal SPA

它们使用相同的数据库进行凭证检查,因此具有相同的标识空间

我已经修改了旧应用程序的登录过程,以便它还向Thinktecture IdentityModel提供凭据并从中获取会话令牌。此令牌被放入会话集合中,以便在旧应用程序调用DAL时呈现

如果启动旧应用程序、进行身份验证、执行操作并关闭浏览器,然后重新打开浏览器,则您已登录ASP.NET应用程序,但未登录,因此没有机会创建会话令牌。这就是问题所在。我需要这两个令牌具有相同的生命周期



我想到了一种可能的方法。我将它作为一个答案呈现在下面,这样人们就可以对它的优点表达自己的观点或提出改进建议。如果我想到任何其他想法,我会将它们作为答案抛出,我希望您也会这样做。

在服务器上,我知道用户id,无论是在生成会话令牌时,还是以后在没有它的情况下重新创建ASP.NET会话时

我需要的是一个相当于cookie的服务器。对“服务器端cookie”的快速搜索返回了几篇文章,其中一篇显然是我在1999年写的,所有这些文章都归结为“使用数据库”

所以。。。我可以用数据库。我们有一个用户表,我可以添加一列。或者我可以创建另一个包含三列的表:UID、SessionToken和CreatedAt

CreatedAt是一个日期时间,我可以从中确定令牌是否已过期,以及何时过期ASP.NET会话以强制新登录


最后我用了一个变体。在我的特定情况下,通过UID,可以从用户表中获取凭据。因此,我将令牌和创建时间放入会话中,否则按上述方式进行。当会话不包含令牌到期时间或令牌已过期时,我获取凭据并请求令牌,然后更新令牌和到期时间

所有这些都封装在一个异常处理程序中,该异常处理程序返回一个伪(无效)令牌,其净结果与具有相同耐久性的令牌的行为相同


您会注意到我没有使用持久表。这样,故障点更少,并且不依赖于编辑数据库模式的能力。管理表中状态的成本至少与生成新令牌的成本一样高。

有什么原因不能对两个令牌都使用较短的令牌寿命?当第一个令牌过期时,只需重新验证,然后撤销寿命较长的令牌或将其替换。您需要的是验证令牌过期配置。然而,你的问题,因为它是非常低的细节,你正在做什么,你正试图实现。为什么要对OAUTH令牌使用localStorage(客户端)和forms auth(服务器端)。