我正在做一个项目,这是我第一次遇到带有API架构的SPA(以及我的第一个.NET Core项目)。 我试图弄清楚身份验证/授权流程应该如何工作,因为它有点复杂。 标识将由本地 ADFS 通过 OAuth 提供。 Angular 前端重定向到 ADFS 登录页面,并使用"code"参数重定向回 SPA,然后应用将其发布到 API 后端中的控制器方法。 然后,API 回调 ADFS 并将身份验证代码交换为令牌,然后根据签名证书验证令牌。
这就是我对如何进行有点模糊的地方。 API 使用 ASP.NET 核心标识,我们需要定义将应用于系统用户的"本地"(应用程序)角色。 Angular 应用程序需要了解这些角色,因此我想在 JWT 中将它们传递回客户端。 是否可以从 ADFS "扩充"令牌以包含其他声明? 我是否应该只创建和颁发与本地用户关联的其他令牌,并在会话期间使用该令牌?
基本上,在高级别上,我感到困惑的是来自 IdP 的"身份"令牌之间的关系,我将用于实际对用户进行身份验证,而角度应用程序将用于签署其 API 请求的令牌(我想还需要对用户进行身份验证)。 在一个更简单的模型中,我假设您可以对两者使用相同的模型,但是如果这种类型的场景有任何最佳实践。 谢谢!
"身份"令牌或id_token
用于身份验证。
"访问"令牌或access_token
用于授权。
因此,当您使用 Angular 客户端通过 ADFS 登录时,它将返回id_token
和access_token
,也许refresh_token
取决于它如何为此特定客户端配置。您的 ADFS 应配置为在access_token
中存储您想要的任何声明,例如name
、email
、role
等......
当您使用 Angular 客户端调用 API 时,它会将access_token
附加到标头(签署请求)。然后,API 必须使用 ADFS 验证令牌。API 应该询问是否允许此客户端访问我?如果是这样,access_token
的任何主张都可以以任何方式使用。不能使用id_token
对请求进行签名,因为它用于使用 ADFS 进行身份验证,而不是使用 API 进行授权。