【问题标题】:Web Api2 OAuth Bearer token lifetime managementWeb Api2 OAuth Bearer 令牌生命周期管理
【发布时间】:2018-02-23 13:44:27
【问题描述】:

不记名令牌不会失效。即使为同一用户颁发了新的不记名令牌,旧令牌仍然有效,可用于访问 API 资源。

我们如何限制(或解决)这个问题。

我有一个 Angular 应用程序,我的 ASP.NET Web API 也位于同一个域中,它使用基于令牌的身份验证,这与 Visual Studio for Web API 的脚手架模板样板代码非常相似,具有个人身份验证。身份验证针对 Windows AD,并在 OAuthAuthorizationServerProvider 实现的 GrantResourceOwnerCredentials 中对其进行了细微更改。

我认为问题是:

1) 生成的不记名令牌即使更改凭据也不会失效。

2) 即使为同一用户名创建了新令牌,为用户名颁发的不记名令牌仍然有效。在这种情况下,两个令牌都是有效的。

3) 如果任何人从一台机器上授权,则令牌可以在该机器上停留很长时间,因此任何其他用户都可以使用该站点并自动获得授权。在注销期间将编写用于从角度代码中清除令牌的代码。但是,如果用户不注销怎么办。

4) 缩短令牌的生命周期是有意义的。但是,此应用程序是针对 Windows AD 进行身份验证的内部应用程序。因此,用户希望登录保持原样,而不是每隔半小时左右的空闲时间重新登录并重新登录。

我想要实现的是:

1) 至少,如果用户登录,之前为同一用户生成的访问令牌需要是无效的。我们将需要一个数据库表(可能称为 UserToken)并手动存储并检查它以实现此目的。如果实现了这一点,至少,登录另一台机器的用户一旦登录回原来的机器,就会拒绝访问令牌。

(用户可以使用任何有效的 AD 帐户登录,因为此项目的身份验证类型为 none,并且通过登录表单针对 AD 进行身份验证)。

我不确定应该考虑哪些其他因素。

欢迎提出任何想法/建议。

(我试着看了一下刷新令牌,但由于它是一个客户端应用程序,不确定我可以在哪里保存刷新令牌并以有效的方式使用。)

【问题讨论】:

    标签: oauth-2.0 asp.net-web-api2 owin bearer-token


    【解决方案1】:

    查看How to limit user to only one access token in ASP.NET Identity

    关于刷新令牌,您需要将其保存在本地存储或 cookie 中。

    【讨论】:

    • 身份验证是针对 Windows Active Directory 而不是 ASP.NET Identity。另外,我想知道哪个是存储刷新令牌的有效位置。如果存储在本地存储/会话存储/cookies中有效,我们为什么不存储访问令牌本身。