1

我的申请流程是,

  1. 用户输入 Url 并显示 AngularJS 登录页面
  2. 用户单击使用 SAML 登录并调用返回 SAML 登录 URL 的 Web API 端点
  3. AngularJS UI 接收 SAML 登录 URL 并将用户重定向到 Idp 登录屏幕
  4. 用户从 Idp 进行身份验证,并且 Idp 调用 AssertionUrl

问题从这里开始,

  1. 如果我在 Web API 上创建一个断言 URL 并验证请求,那么 AngularJS UI 将如何知道登录是否成功?

在 MVC 和 Web 表单的情况下,这非常简单,但在 AngularJS/Angular SPA 的情况下应该怎么做呢?

编辑1:

登录流程

SPA -> API -> SPA -> Idp

(SPA调用API,API生成SAML Request并返回给SPA,SPA然后重定向到Idp)

断言流程

Idp -> API ?温泉

(Idp 在 API 中调用 AssertionUrl,API 生成 JWT,但如何将其发送到 SPA?)

4

2 回答 2

1

在 AngularJS/Angular SPA 中,您有两种可能的解决方案来处理成功 SAML 2.0 身份验证后的后续用户会话。

  1. 使用 ASP.NET MVC 中的 cookie。您必须限制 cookie 以使其在 SPA 中安全。它要求您的 API 和 SPA 位于同一个域中。

  2. 成功登录后创建 JWT 访问令牌。将其交给 SPA 并在后端 API 代码中的每个 API 调用中进行验证。

您可以使用ITfoxtec.Identity包创建 JWT 访问令牌。通过调用JwtHandler.CreateToken方法https://github.com/ITfoxtec/ITfoxtec.Identity/blob/master/src/Tokens/JwtHandler.cs#L38

编辑 1

SPA、IdP 和 API 之间的所有通信要么重定向,要么通过客户端浏览器发布。

在断言流程中成功认证后。API 可以使用 URL 中的查询或片段中的访问令牌重定向到 SPA

于 2021-03-25T10:22:40.413 回答
0

在 Angular 中,创建一个组件(Token 组件)并为它创建一个路由(如 /token)。该路线应采用 /token/{token_id} 之类的路线参数。令牌组件从路由参数中获取令牌值并保存在会话存储中。在所有 api 调用之前,角度拦截器将从会话存储中获取令牌值并添加为标头

于 2022-01-30T09:44:01.923 回答