OpenID - 将令牌存储在后端或前端以及客户端机密中

时间:2021-02-12 20:51:17

标签: angular asp.net-mvc security jwt openid-connect

我当前的设置是我在 Angular(前端)和 .NET Core MVC(后端)之间使用 Cookie 身份验证,在后端和我们由另一个团队维护的身份服务器之间使用 JWT 令牌。后端正在使用 client_id / client_secret 并针对证书验证 JWT 令牌,以确保 id 令牌有效并由批准的颁发者颁发。

------------------             -----------------------    
|Angular Frontend| <---------> |.Net Core MVC Backend| 
------------------   Cookie    ----------------------
                                          |
                                          | JWT
                                          |
                                -----------------
                                |Identity Server|
                                -----------------

我现在有一个要求,如果用户在 30 分钟内处于非活动状态,就应该退出,这导致的问题比我想象的要多。 我首先尝试在前端和后端之间保留一个滑动 cookie,但问题是如果 cookie 已过期,用户将被重定向到身份服务器登录页面,然后再次自动登录,因为身份服务器还存储了一个 cookie与其他应用程序单点登录。现在已经解决了这个问题,但将令牌生命周期缩短到 30 分钟。

现在我发现我在使用刷新令牌延长令牌寿命时遇到了问题。问题是前端有时会发出多个 API 请求,如果需要刷新令牌,后端会尝试使用身份服务器为每个 API 请求刷新令牌。

因此,我希望通过公开访问令牌或 id 令牌和刷新令牌来完全删除 cookie 并在前端和后端之间使用令牌身份验证。

这就是我想要的方式:

------------------                   -----------------------    
|Angular Frontend| <---------------> |.Net Core MVC Backend| 
------------------   Access token    ----------------------
                        or                     |
                id token, refresh token        | Renew tokens with client id 
                Renew tokens by calling        | client secret stored in backend
                backend endpoints without      | 
                any client id                  |
                client secret.          -----------------
                                        |Identity Server|
                                        -----------------
  1. 在后端创建两个暴露给前端的端点。登录(与之前相同)并刷新令牌端点。这些端点现在将向前端公开令牌。
  2. 前端将用户重定向到后端登录。 (和之前一样)
  3. 后端将用户重定向到身份服务器。身份服务器向后端发送回调请求,后端使用 client_id / client_secret 获取访问令牌、id 令牌和刷新令牌。 (和之前一样)
  4. 后端将令牌返回给前端。 (访问令牌或 id 令牌和新鲜令牌)
  5. 前端将令牌保存在会话存储中,并在每个 API 请求中使用令牌。
  6. 前端在需要延长令牌生命周期时调用后端来刷新令牌端点。 (现在我可以确保只调用一次身份服务器刷新令牌)

问题:

  1. 这样安全吗?前端没有任何 client_id / client_secret 信息,我将继续将其保留在后端。前端现在有权通过后端服务器获取令牌并刷新令牌。
  2. 我应该只向前端公开访问令牌吗? 这意味着我需要在来自存储的每个请求上查找 id 令牌以对请求进行身份验证,还是应该向前端公开 id 令牌和访问令牌?

0 个答案:

没有答案