我想构建一个带有 (Asp.Net Core) 后端的 (Angular) SPA,并使用安全最佳实践。我的计划如下:
- SPA 显示一个 Login 按钮
- 点击 Login 按钮会启动与某个身份提供者(Google、Microsoft 等)的授权码 openid-connect 流程。
- 用户通过身份提供者进行身份验证,然后被重定向回 SPA 并获得授权码。
- 然后 SPA 发送一个 login 请求到后端并传递授权码。
- 后端向身份提供者发出请求,用代码交换 id_token 并为用户创建一些类型的会话凭据。
现在这就是我因缺乏恰当理解而陷入困境的地方
问题 1 - 最佳实践
上述流程是否被视为最佳实践?还是我做错了?
问题 2 - 身份验证凭据
我的后端只是 API,不为用户呈现 HTML 页面,只提供 Json 响应。我应该创建什么样的身份验证凭证?它应该是 JWT 还是 Cookie?我认为它不能是 Cookie,因为 API 无法返回浏览器将正确存储的 Cookie。所以它必须是某种令牌,最好是 JWT。SPA 应该如何存储它,本地/会话存储?
问题 3 - 过期和刷新
假设后端向 SPA 返回一个 JWT,这个 JWT 应该包含什么?它的过期时间应该是多久?我应该如何处理自动刷新?
问题 4 - 必需的软件包和库
此外,特定于编程(因为这毕竟是一个编程问题),为此需要使用哪些必需库。问题既针对 SPA 又针对后端。我认为 SPA 需要某种 openid-connect 客户端,并且我需要一些库在后端完成授权码流程(用代码交换 id_token)这是否由 IdentityServer4
完成?还是有其他库可以完成?
更新
我已经准备了一个解决方案,力求展示一切的正确方式。它还是一个正在进行,杂乱无序,但很简洁,它能工作并且努力遵循最佳实践。