【问题标题】:IdentityServer4 - combining MVC and SPA - avoid extra round tripIdentityServer4 - 结合 MVC 和 SPA - 避免额外的往返
【发布时间】:2018-02-22 09:54:57
【问题描述】:

我有一个网站,它结合了 ASP.NET Core MVC 和基于角度的 SPA,我正在尝试使用 IdentityServer4 来保护它。目前的登录流程如下所示:

  1. 用户单击主页上的登录按钮(www.example.com,MVC 基于)
  2. 用户被重定向到登录页面(login.example.com,基于 MVC)并登录
  3. 用户被重定向到 www.example.com/app,站点检测到它没有用户的 cookie,因此它将用户重定向到 login.example.com/connect/authorize 端点
  4. 用户被重定向回网站,id_token 指向 www.example.com/signin-oidc,这会丢弃 cookie
  5. 用户最终被重定向到应该显示 SPA 的 www.example.com/app

问题是,当这最终完成时,SPA 需要访问令牌,以便它可以调用 API。我尝试使用 angular-auth-oidc-client 库,问题是这会等待整个 Angular 应用程序加载应用程序才发现它没有访问令牌并再次重定向到 login.example.com /connect/authorize 端点以获取令牌。

有更简单的方法吗? IE。在第 5 步使用访问令牌将用户重定向到应用程序?或者选择一种完全不同的方式来识别身份?

【问题讨论】:

  • 所以您的服务器端代码中有访问令牌,您需要一种方法将其提供给您的客户端代码吗?您能否将其写入(会话)cookie 中,然后您的客户端代码可以读取和使用?

标签: angular asp.net-core-mvc identityserver4 openid-connect implicit-flow


【解决方案1】:

首先,在第 2 步之后用户应该登录,然后第 4 步为什么 3,听起来不对。这种情况应由混合流处理,当第 4 步发生时,客户端应用程序应具有 id 令牌和访问令牌。您现在应该拥有可以访问“访问令牌”的控制器。您可以创建一个基类,该基类返回带有标头的 httpclient。

您从 Angular 应用程序调用的所有内容都应通过这些控制器,这些控制器将调用您的服务器 API。

【讨论】:

  • 是的,你是对的,第3步不正确,直接进入第4步。关于其他的,你说的客户端是什么意思? MVC 使用 cookie 作为身份验证,并在步骤 4 中创建一个带有 id 令牌的 cookie。角度应用程序在哪里获得访问令牌?顺便提一句。 API 是一堆完全独立的站点,我想直接从 Angular 应用程序调用它们,而不是通过另一台服务器。
  • ClientApp 表示您的身份服务器的客户端,您的 Angular 应用程序。您的客户端应用程序使用什么授予类型?混合或隐式
  • 目前我正在使用隐式流,因为我在各种来源中发现它作为 SPA 的 tge 推荐流。据我了解,唯一的。不同之处在于在一次往返中获取 id 令牌和访问令牌,但在 MVC 一侧。我应该如何安全地将它传递给 Angular 应用程序?
  • 如果你使用隐式流,那么你可以使用oidc-client library。与隐式流访问令牌一样,将传递给浏览器,并且该库具有所有其他有用的方法来检查用户是否经过身份验证等,但是您说您使用了它,但不太明白问题出在哪里
  • 我正在使用它,问题是到授权端点的双重往返,一旦被重定向到signin-oidc,然后加载角度SPA,它发现它没有令牌所以它再次重定向到授权端点,这次是访问令牌。
猜你喜欢
  • 1970-01-01
  • 2020-09-09
  • 2016-12-24
  • 1970-01-01
  • 2020-02-10
  • 2013-08-07
  • 2012-01-26
  • 1970-01-01
  • 2019-06-29
相关资源
最近更新 更多