桥接表单身份验证和 OAUTH

Bridging forms authentication and OAUTH

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

问题是这些令牌有不同的生命周期。

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

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

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


一些背景知识,因为有些人不清楚我在问什么。

有一个丑陋的老派 ASP.NET Web 应用程序使用基于表单的安全性

我刚刚将新内容添加为使用 Thinktecture IdentityModel 的单独 DAL 应用程序。此 DAL 由两个应用程序使用,ASP.NET 应用程序和一个 Durandal SPA。

他们使用相同的数据库进行凭据检查,因此他们具有相同的身份 space。

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

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


我想到了一种可能的方法。我在下面将其作为答案呈现,以便人们可以就其优点发表意见或提出改进建议意见。如果我想到任何其他想法,我会把它们作为答案提出来,我希望你也这样做。

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

我需要的是相当于 cookie 的服务器。快速搜索 "server side cookie" 返回了几篇文章,其中一篇显然是我在 1999 年自己写的,所有这些都归结为 "use a database".

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

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


我最终使用了一个变体。在我的具体案例中,使用 UID,可以从用户 table 获取凭据。所以我将令牌和创建时间放入会话中,否则按上述方式进行。当 Session 不包含令牌到期时间或令牌已过期时,我获取凭据并请求令牌,然后更新令牌和到期时间。

所有这些都包含在一个异常处理程序中,该异常处理程序 returns 一个虚拟(无效)令牌,其最终结果是行为与具有相同持久性的令牌相同。

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