And*_*ykh 8 .net dotnetopenauth oauth-2.0
我正在基于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.这可能使查找目标授权记录变得困难.从理论上讲,我们可以尝试通过客户端,用户和发布时间的组合来查找它,但据我所知,并不能保证它们是唯一的.
现在用户不时被禁用.我想同时撤销令牌.我该怎么做呢?我怀疑我需要使用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,但是客户端用户发布范围的元组应该是唯一的,因为您的授权表应该有一个唯一的约束,因为重复项没有意义.此外,如果它们不是唯一的,那么只有该元组的任何记录的存在表明授权是有效的.
希望这可以帮助.