Angular SPA 中的 OpenID Connect 与 Asp.Net Core 3.1 后端

Avi*_* P. 7 openid-connect asp.net-core identityserver4 angular

我想用(Asp.Net Core)后端构建一个(Angular)SPA,我想使用安全最佳实践。我的计划是这样的:

  1. SPA 显示登录按钮
  2. 单击“登录”按钮会启动与某些身份提供商(Google、Microsoft 等)的授权代码openid-connect流程
  3. 用户向身份提供者进行身份验证,然后使用授权码重定向回 SPA
  4. SPA然后向后端发出登录请求并传递授权码
  5. 后端向身份提供者发出请求,交换id_token的代码,并为用户创建某种会话票证

现在这是我因缺乏正确理解而陷入困境的地方

问题 1 - 最佳实践

上述程序甚至被认为是最佳实践吗?还是我做错了?

问题 2 - 身份验证票证

我的后端只是 API,它不为用户呈现 HTML 页面,只提供 Json 响应。我应该创建什么样的身份验证票?它应该是 JWT 还是 Cookie?我认为它不能是 cookie,因为 API 无法返回浏览器将正确存储的 cookie。所以它必须是某种令牌,最好是 JWT。SPA 应该如何存储它,本地/会话存储?

问题 3 - 过期和刷新

假设后端返回一个 JWT 给 SPA,这个 JWT 应该包含什么?它的到期时间应该是多少?我应该如何处理自动刷新?

问题 4 - 所需的包和库

此外,特定于编程(因为这毕竟是一个编程问题),用于所有这些所需的库是什么。问题既针对 SPA,也针对后端。我假设我需要某种用于 SPA的openid-connect客户端,并且我需要后端的一些库来完成授权代码流(交换id_token的代码),这是由IdentityServer4? 或者有没有其他图书馆。

更新

我准备了一个解决方案,力求展示做所有事情的正确方法。这是一项正在进行的工作,凌乱且不干净,但它是最小的,它有效并且努力遵循最佳实践。

https://github.com/paviad/dotnet-angular-fullstack

Jan*_*raj 2

OpenID Connect是一个标准(在 OAuth 2.0 之上),它有很多流程(您提到了一个Authorization Code flow,这对于 SPA 来说不是最好的。

建议Implicit flow使用 SPA 应用程序,其中 SPA 直接从 IdP 接收令牌。隐式流现已弃用,Authorization Code with PKCE Flow是目前 SPA 的最佳选择。这篇随机博客文章将为您提供有关这些流程的更多详细信息。

SPA 还可能收到刷新令牌,该令牌可用于获取新的访问令牌,但这取决于使用的 IdP。

后端只需要库来验证令牌(来自请求Authorization标头),最终需要验证一些声明(例如角色)以进行可选授权。它不需要处理任何 OIDC 流,因为它通常通过响应代码(200、401、403、500...)与 SPA 通信,并且 SPA 处理错误。

恕我直言,只需为您的 SPA(我最喜欢的 Angular )选择合适的库(首选OIDC 认证),它将提供许多开箱即用的有用 SPA 功能(正确的流程、令牌刷新、令牌存储、用于后端调用的 http 拦截器,... )。我会避免任何 IdP 提供的库 - 它可以快速实现实施,但如果它们提供 OIDC 标准之外的某些功能,则可能会被 IdP 供应商锁定。

  • 假设OP在asp.net core中托管SPA,是否可以先在core中处理OAuth,然后将令牌传递给SPA使用?这样就不需要额外的后端库来验证传递到 API 端点的令牌。Core 具有开箱即用的中间件中实现的所有逻辑。 (2认同)