chi*_*s0v 6 authentication oauth-2.0 single-page-application reactjs identityserver4
我正在尝试使用 ASP.NET Core 和 IdentityServer4 实现 SPA React 客户端的授权代码流。
有两种情况:
1)用户打开SPA应用程序,我们检查他是否有访问令牌,如果没有,我们生成像这样的url
/connect/authorize?
client_id=*client_id*&
redirect_uri=*redirect_uri*&
response_type=code&
response_mode=fragment&
state=*some_state*&
nonce=*some_nonce*&
code_challenge=*code_challenge*&
code_challenge_method=S256&
scope=openid profile email
Run Code Online (Sandbox Code Playgroud)
这样授权代码流程就开始了。这工作得非常清楚,在所有往返之后,用户带着代码返回 SPA 应用程序,然后发送令牌请求(包括代码和 code_verifier),然后接收它,并带着幸福的灵魂继续使用我们伟大的应用程序。
2)用户直接打开登录页面,这就是我陷入困境的地方。/connect/authorizeIdentityServer 上下文对此用户、代码挑战等一无所知,因为我们在正常流程中进入此页面之前没有发出请求。下一步是什么?
我可以/connect/authorize直接在登录页面中生成链接,然后进行丑陋的重定向,然后返回登录页面(老实说我不想这样做),但是我的 SPA 应用程序如何知道我在这里生成的 code_verifier 是什么?当然,我可以将其存储在一些共享的跨域 cookie 中,但我相信这里应该有更好的方法。
另一个解决方案是我可以将用户从登录页面重定向到我的应用程序,它会识别出该用户未经授权,然后我们开始场景 #1。我认为这也不是我的首选方法。
如果用户直接打开我的身份服务器页面,我该怎么办?使用授权代码流是否可以实现这一点,或者我应该考虑将其他一些流与此流结合起来?
由于 OAuth 2.0 规范的新建议,我不想使用隐式流。
对此的答案非常简单 - 在您的第二种情况下 - 如果您的用户直接打开 IDP 登录页面,他们不想进入您的应用程序。如果您使用 Google 或 Facebook 或其他已知的 IDP 之一作为您的 SPA,情况是一样的,作为用户,我只是转到他们的登录页面。他们不可能知道我的意图是否是登录,以便稍后将我重定向到您的 SPA。
现在已经说了所有这些 - 您可以做的事情是使这项工作在某种程度上无缝 - 是在用户通过 Identity Server 4 登录后重定向到 SPA 的受保护页面(这很简单,因为您拥有登录页面,并且这里不涉及 OAuth )。然后,您的 SPA 将被触发以启动 OAuth2 流程,并将重定向回 Identity Server 4。不过,用户在几秒钟前已经登录,因此将跳过登录过程,并且将向用户显示同意页面,或者如果您的客户端配置为跳过同意页面 - 用户将使用常用令牌等重定向回您的 SPA。
因此,将其分解为流程:
用户访问 IDS4 登录页面 -> 用户输入凭据 -> IDS4 对用户进行身份验证并重定向到您的 SPA 受保护页面 -> 您的 SPA 启动 OAuth2 流程并重定向回 IDS4 -> IDS4 显示同意页面 -> IDS4 向您的 SPA 发出授权码。
当然,这里还有一个额外的步骤,即您的 SPA 将用身份验证代码交换访问令牌,但为了清楚起见,我省略了它,因为它与问题无关。
| 归档时间: |
|
| 查看次数: |
1812 次 |
| 最近记录: |