9

我正在实现基于 DotNetOpenAuth 的 OAuth2 授权/资源服务器。我的服务器将发出寿命很长的访问令牌。这些令牌将在 iOS 设备上使用。我看到的流程是这样的,1)要求用户在 iOS 设备上输入他们的用户名/密码 2)请求访问令牌,授予类型为资源所有者密码凭据 3)授予并存储令牌在 iOS 设备上以供将来使用。

现在有时用户会被禁用。我想同时撤销令牌。我该怎么做呢?我怀疑我需要为此使用ICryptoKeyStore.RemoveKey方法,但不确定如何找到要删除的密钥。

注 1:将来该服务器将被第三方 Web 应用程序使用。

注意 2:拥有授予类型的资源所有者密码凭据的要求源于这样一个事实,即认为在 iOS 设备上实现浏览器重定向不值得花时间。

更新 1 源代码中的一些挖掘表明 DotNetOpenAuth 不支持这种强制令牌过期的能力。此外,在标准实现中甚至没有检查令牌的生命周期。据我所见,calss 对此负责StandardAccessTokenAnalyzer,它忽略了LifetimeandUtcCreationDate属性。此外,标准类似乎没有ResourceServer任何数据库访问编码,令牌有效性仅由令牌内容检查,所以似乎如果我需要添加使令牌过期的能力,我需要ResourseServer自己连接到数据库。我错过了什么吗?

更新 2 我想我在这里找到了答案:https ://groups.google.com/forum/#!topic/dotnetopenid/ aLabu1ujkt4 这不是我所希望的,我仍然有一些不清楚的地方。例如,安德鲁写道:

然后,您的自定义类可以获取访问令牌,然后使用对授权服务器的私有 HTTP 请求来验证令牌的持续有效性。

鉴于不包括授权 ID ,尚不清楚如何进行此验证。AccessToken这会使查找目标授权记录变得困难。理论上,我们可以尝试通过结合客户、用户和发布时间来查找它,但据我所知,不能保证这些都是唯一的。

4

1 回答 1

8

现在有时用户会被禁用。我想同时撤销令牌。我该怎么做呢?我怀疑我需要为此使用 ICryptoKeyStore.RemoveKey 方法,但不确定如何找到要删除的密钥。

您可以通过撤销令牌背后的授权来撤销令牌。这通常意味着您删除数据库授权表中的条目。这必须具有的效果是您的实现IAuthorizationServerHost.IsAuthorizationValid将为此授权返回 false。

这不会立即撤销访问令牌,但会阻止客户端刷新过期的访问令牌。因此,只要您的访问令牌的生命周期相当短(一小时或更短),那么用户的禁用帐户就意味着所有客户端访问都将在一小时内终止。

注意 2:拥有授予类型的资源所有者密码凭据的要求源于这样一个事实,即认为在 iOS 设备上实现浏览器重定向不值得花时间。

这是你的应用程序。但我敦促大家使用正确的浏览器重定向流程。用户可能已经在设备的浏览器上登录到您的服务器,因此他们可以完全避免通过这种方式输入他们的凭据,从而提高您的转化率。与设备应用程序相比,用户也更有可能信任要求其凭据的浏览器。至少我希望如此。

顺便说一句,非身份验证客户端 (TBD)可能不支持资源所有者密码授予类型,而安装的设备应用程序通常会支持。因此,您可能会被迫使用不同的授权类型。

更新 1源代码中的一些挖掘表明 DotNetOpenAuth 不支持这种强制令牌过期的能力。此外,在标准实现中甚至没有检查令牌的生命周期。据我所见,calss 对此负责的是 StandardAccessTokenAnalyzer,它忽略了 Lifetime 和 UtcCreationDate 属性。

DotNetOpenAuth检查并拒绝过期的访问令牌。只是不在那个班级。它在反序列化访问令牌的代码中进行了检查。

此外,标准 ResourceServer 类似乎没有任何数据库访问编码,令牌有效性仅由令牌内容检查,因此似乎如果我需要添加使令牌过期的能力,我需要自己将 ResourseServer 连接到数据库. 我错过了什么吗?

您是正确的,ResourceServer该类不需要任何数据库访问,因为假定访问令牌在其整个生命周期内都有效(默认情况下它们是不可撤销的)。这就是为什么建议使用较短的访问令牌生命周期。这并不像你想象的那么遥远。例如,您很可能已经使用的 ASP.NET 表单身份验证基于相同的模式:对用户进行一次身份验证,访问数据库进行凭据检查,然后向用户代理发出加密和签名的 HTTP cookie。从那时起,数据库不会在每个传入的 HTTP 请求上都被命中——cookie 签名被验证,然后假定它是有效的,直到 cookie 过期。同样的原理。除了在 HTTP cookie 的情况下,还有一个滑动超时,因此只要用户在站点上保持活动状态,他们就不必重新进行身份验证。使用 OAuth 2 访问令牌,无论使用得多活跃,它们都会过期,从而强制刷新令牌,然后可以拒绝该令牌以锁定访问。

鉴于 AccessToken 不包含授权 ID,尚不清楚如何进行此验证。这会使查找目标授权记录变得困难。理论上,我们可以尝试通过结合客户、用户和发布时间来查找它,但据我所知,不能保证这些都是唯一的。

确实没有包含 ID,但是 client-user-issuedate-scope 的元组应该是唯一的,因为您的授权表应该有一个唯一的约束,因为重复是没有意义的。此外,如果它们不是唯一的,那么只要存在带有该元组的任何记录就表明授权是有效的。

希望这可以帮助。

于 2012-05-02T00:15:27.763 回答