Angular SPA 中的 OpenID Connect 与 Asp.Net Core 3.1 后端
OpenID Connect in Angular SPA with Asp.Net Core 3.1 Backend
我想构建一个 (Angular) 具有(Asp.Net 核心)后端的 SPA,并且我想使用安全最佳实践。我的计划是这样的:
- SPA 显示一个 登录 按钮
- 单击 登录 按钮启动授权代码 openid-connect 流与一些身份提供商(Google、微软、等等)
- 用户通过身份提供者进行身份验证,然后使用授权码重定向回 SPA
- SPA然后向后端发起登录请求,并传递授权码
- 后端向身份提供者发出请求,将代码交换为 id_token,并为用户创建某种会话票证
这就是我因缺乏正确理解而陷入困境的地方
第 1 期 - 最佳实践
上述程序是否被认为是最佳实践?还是我做错了?
问题 2 - 身份验证票证
我的后端只有 API,它不会为用户呈现 HTML 页面,只提供 Json 响应。我应该创建什么样的身份验证票?应该是 JWT 还是 Cookie?我认为它不可能是 cookie,因为 API 不能 return 浏览器将正确存储的 cookie。所以它必须是某种令牌,最好是 JWT。 SPA应该怎么存储,本地/会话存储?
问题 3 - 过期和刷新
假设后端 return 是 SPA 的 JWT,这个 JWT 应该包含什么?它的到期时间应该是多少?我该如何处理自动刷新?
问题 4 - 所需的包和库
此外,具体到编程(因为这毕竟是一个编程问题),所有这些都需要使用哪些库。问题既针对 SPA,也针对后端。我假设我需要某种 openid-connect SPA 客户端,并且我需要一些后端库来完成授权代码流(将代码交换为 id_token)这是IdentityServer4
做的?或者有没有其他图书馆。
更新
我准备了一个解决方案,力求展示做每件事的正确方法。这是一项正在进行的工作,杂乱无章,但它是最小的,它有效并且努力遵循最佳实践。
OpenID Connect
是一个标准(在 OAuth 2.0 之上)并且它有很多流程(你提到了一个 Authorization Code flow
,这不是 SPA 的最佳选择。
建议 Implicit flow
用于 SPA 应用,其中 SPA 直接从 IdP 接收令牌。隐式流现在已弃用,Authorization Code with PKCE Flow
是目前 SPA 的最佳选择。 random blog post 将为您提供有关这些流程的更多详细信息。
SPA 可能还会收到刷新令牌,可用于获取新的访问令牌,但这取决于使用的 IdP。
后端只需要库来验证令牌(来自请求 Authorization
header),最终它需要验证一些声明(例如角色)以获得可选的授权。它不需要处理任何 OIDC 流,因为它通常通过响应代码(200、401、403、500,...)返回 SPA 并由 SPA 处理错误。
恕我直言,只是 select 合适的库(更喜欢 OIDC certified) for your SPA (my favorite for Angular),它将提供许多开箱即用的有用 SPA 功能(正确的流程、令牌刷新、令牌存储、用于后端调用的 http 拦截器、 ...)。我会避免任何 IdP 提供的库 - 它可以快速实现实施,但它可以是 IdP 供应商 lock-in 如果他们提供 OIDC 标准之外的一些功能。
我想构建一个 (Angular) 具有(Asp.Net 核心)后端的 SPA,并且我想使用安全最佳实践。我的计划是这样的:
- SPA 显示一个 登录 按钮
- 单击 登录 按钮启动授权代码 openid-connect 流与一些身份提供商(Google、微软、等等)
- 用户通过身份提供者进行身份验证,然后使用授权码重定向回 SPA
- SPA然后向后端发起登录请求,并传递授权码
- 后端向身份提供者发出请求,将代码交换为 id_token,并为用户创建某种会话票证
这就是我因缺乏正确理解而陷入困境的地方
第 1 期 - 最佳实践
上述程序是否被认为是最佳实践?还是我做错了?
问题 2 - 身份验证票证
我的后端只有 API,它不会为用户呈现 HTML 页面,只提供 Json 响应。我应该创建什么样的身份验证票?应该是 JWT 还是 Cookie?我认为它不可能是 cookie,因为 API 不能 return 浏览器将正确存储的 cookie。所以它必须是某种令牌,最好是 JWT。 SPA应该怎么存储,本地/会话存储?
问题 3 - 过期和刷新
假设后端 return 是 SPA 的 JWT,这个 JWT 应该包含什么?它的到期时间应该是多少?我该如何处理自动刷新?
问题 4 - 所需的包和库
此外,具体到编程(因为这毕竟是一个编程问题),所有这些都需要使用哪些库。问题既针对 SPA,也针对后端。我假设我需要某种 openid-connect SPA 客户端,并且我需要一些后端库来完成授权代码流(将代码交换为 id_token)这是IdentityServer4
做的?或者有没有其他图书馆。
更新
我准备了一个解决方案,力求展示做每件事的正确方法。这是一项正在进行的工作,杂乱无章,但它是最小的,它有效并且努力遵循最佳实践。
OpenID Connect
是一个标准(在 OAuth 2.0 之上)并且它有很多流程(你提到了一个 Authorization Code flow
,这不是 SPA 的最佳选择。
建议 Implicit flow
用于 SPA 应用,其中 SPA 直接从 IdP 接收令牌。隐式流现在已弃用,Authorization Code with PKCE Flow
是目前 SPA 的最佳选择。 random blog post 将为您提供有关这些流程的更多详细信息。
SPA 可能还会收到刷新令牌,可用于获取新的访问令牌,但这取决于使用的 IdP。
后端只需要库来验证令牌(来自请求 Authorization
header),最终它需要验证一些声明(例如角色)以获得可选的授权。它不需要处理任何 OIDC 流,因为它通常通过响应代码(200、401、403、500,...)返回 SPA 并由 SPA 处理错误。
恕我直言,只是 select 合适的库(更喜欢 OIDC certified) for your SPA (my favorite for Angular),它将提供许多开箱即用的有用 SPA 功能(正确的流程、令牌刷新、令牌存储、用于后端调用的 http 拦截器、 ...)。我会避免任何 IdP 提供的库 - 它可以快速实现实施,但它可以是 IdP 供应商 lock-in 如果他们提供 OIDC 标准之外的一些功能。