1

我在我的网络应用程序中使用基于令牌的安全性。服务器端是使用 c# 编写的,我使用 openiddict 登录和发布令牌,在此处找到。我在货币上使用隐式流。

默认情况下,我的令牌的有效期为 1 小时,之后您必须再次登录。我已将我的 API 锁定为仅接受不记名令牌而不接受 cookie。

我想实现刷新令牌,但在阅读了许多网站之后,似乎在 Web 应用程序上实现刷新令牌并不是一个好方法,因为黑客获取了刷新令牌。我知道要使用刷新令牌,您必须使用代码流,而不是隐含的,我可以这样做。

人们如何在他们的网络应用程序中解决这种情况?我不能是唯一一个希望令牌在 Web 应用程序中持续超过一个小时的人吗?

4

1 回答 1

2

OpenID Connect 推荐的方法是在隐藏帧中发送授权请求,其参数与您用于初始隐式流请求的参数相同,prompt=none并且可选地,id_token_hint对应于id_token您从授权响应中提取的参数。

使用prompt=none时,身份提供者不会显示任何同意表单,而是直接将用户代理重定向到redirect_uri您指定的用户代理,并将新令牌附加到 URI 片段,就像经典的隐式流请求一样。popup.location.hash您可以通过从属性中提取它来检索它。

如果无法处理请求(无效请求、未经身份验证的用户、无效id_token_hint、需要同意等),则会返回错误,并且身份提供者将redirect_uri使用error参数将用户代理重定向到 或停止处理请求。

请注意,由于相同的来源策略,popup.location.hash如果当前位置属于不同的域(例如,如果身份提供者拒绝将用户代理重定向到您的客户端应用程序),您将无法访问:它将抛出拒绝访问异常。在这种情况下,最好为“刷新”操作添加超时。

可悲的是,很少有库可以帮助您完成这项任务。oidc-token-manager就是其中之一,但它有一些限制将阻止它与 OpenIddict 一起使用 OTB:它不支持原始 RSA 密钥(您必须在 OpenIddict 选项中明确使用 X509 证书)并且它发送请求时不发送id_token_hintOpenIddict 所需的参数prompt=none

于 2016-03-17T15:07:37.553 回答