我正在基于DotNetOpenAuth实现OAuth2授权/资源服务器。我的服务器将发布具有很长使用寿命的访问令牌。这些令牌将用于iOS设备。流程,我看到的方式是这样的,1)要求用户在iOS设备上输入他们的用户名/密码2)请求访问令牌,授权类型为资源所有者密码凭证3)令牌被授予和存储在iOS设备上供将来使用。
现在用户不时被禁用。我想同时撤销令牌。我该怎么做呢?我怀疑我需要使用ICryptoKeyStore.RemoveKey
方法,但不知道如何找到要删除的密钥。
注1:将来服务器将由第三方Web应用程序使用。
注2:要求获得资源所有者密码凭证的授权类型源于这样一个事实,即确定在iOS设备上实施浏览器重定向是不值得的。
更新1
源代码中的一些挖掘表明DotNetOpenAuth不支持强制令牌过期的能力。此外,在标准实现中,令牌的生命周期甚至没有被检查。据我所知,calss对此负责StandardAccessTokenAnalyzer
,它会忽略Lifetime
和UtcCreationDate
属性。此外,标准ResourceServer
类似乎没有任何数据库访问编码,令牌有效性仅由令牌内容检查,因此似乎如果我需要添加使令牌过期的能力,我需要连接到我自己ResourseServer
到数据库。我错过了什么吗?
更新2 我想我在这里找到了答案:https://groups.google.com/forum/#!topic/dotnetopenid/aLabu1ujkt4这不是我所希望的,我仍然有一些不清楚。例如,安德鲁写道:
然后您的自定义类可以获取访问令牌,然后使用私有 HTTP请求授权服务器验证是否继续 令牌的有效性。
鉴于AccessToken
不包含授权ID,目前尚不清楚如何此验证可能发生。这可能使查找目标授权记录变得困难。从理论上讲,我们可以尝试通过客户端,用户和发布时间的组合来查找它,但据我所知,并不能保证它们是唯一的。
答案 0 :(得分: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,但是客户端用户发布的范围的元组应该是唯一的,因为您的授权表应该对其具有唯一约束,因为具有重复项是没有意义的。此外,如果它们不是唯一的,那么只要存在任何带有该元组的记录就表明授权是有效的。
希望这有帮助。