带有 SPA 的 .NET Core WebApi 项目中的混合身份验证流程

Posted

技术标签:

【中文标题】带有 SPA 的 .NET Core WebApi 项目中的混合身份验证流程【英文标题】:Hybrid auth flow in .NET Core WebApi project with SPA 【发布时间】:2018-08-11 09:00:43 【问题描述】:

我正在开发一个项目,这是我第一次遇到具有 API 架构的 SPA(以及我的第一个 .NET Core 项目)。我试图弄清楚身份验证/授权流程应该如何工作,因为它有点复杂。身份将由本地 ADFS 通过 OAuth 提供。 Angular 前端重定向到 ADFS 登录页面,并使用“code”参数重定向回 SPA,然后应用程序将其发布到 API 后端中的控制器方法。然后 API 回调 ADFS 并用身份验证代码交换令牌,然后根据签名证书验证令牌。

这就是我对如何进行有点模糊的地方。 API 使用 ASP.NET Core 标识,我们需要定义将应用于系统用户的“本地”(应用程序)角色。 Angular 应用程序需要知道这些角色,所以我想在 JWT 中将它们传递给客户端。是否可以从 ADFS 中“增加”令牌以包含其他声明?我是否应该创建并发布与本地用户关联的不同令牌并在会话期间使用它?

基本上,我很困惑的是来自 IdP 的“身份”令牌(我将用于实际验证用户)与 Angular 应用程序将用于对其签名的令牌之间的关系是什么API 请求(我想这也需要对用户进行身份验证)。在一个更简单的模型中,我假设您可以对两者使用相同的模型,但是如果有针对这种场景的任何最佳实践。谢谢!

【问题讨论】:

【参考方案1】:

“身份”令牌或id_token 用于身份验证。

“访问”令牌或access_token 用于授权。

因此,当您使用 Angular 客户端通过 ADFS 登录时,它将返回 id_tokenaccess_token 并且可能返回 refresh_token 取决于它是如何为这个特定客户端配置的。您的 ADFS 应配置为在 access_token 中存储您想要的任何声明,例如 nameemailrole 等...

当您使用 Angular 客户端调用 API 时,它会将 access_token 附加到标头(签署请求)。然后,API 必须使用 ADFS 验证令牌。 API 应该询问是否允许此客户端访问我?如果是这样,access_token 的任何声明都可以以任何方式使用。您不能使用id_token 对请求进行签名,因为它用于通过 ADFS 进行身份验证,而不是通过 API 进行授权。

【讨论】:

我在令牌端点从 ADFS 返回的响应 only 包含访问令牌:` "access_token":"...","token_type": "bearer","expires_in":3600 ` @lmerry213 查看如何从 API 上的访问令牌中提取声明

以上是关于带有 SPA 的 .NET Core WebApi 项目中的混合身份验证流程的主要内容,如果未能解决你的问题,请参考以下文章

在单个 ASP.NET Core 3.1 Web API 中管理两个 SPA;一个在根目录中,另一个在“管理员”路由中

使用 .Net 5 WebAPI 的 Vue SPA 的正确 OIDC 流程是啥?

与 ASP.NET Core 中的 FromBody 混淆

.NET Core WebAPI - 带有属性路由的 404 回退

SignalR 授权无法在带有 Identity Server 的 asp.net core angular SPA 中开箱即用

带有 ASP.NET Core WebAPI 的 Dart 中的令牌刷新并发问题