带有外部提供程序的 IdentityServer4。使用 id_token 重定向到前端页面

IdentityServer4 with external provider. Redirect to frontend page with id_token

我已经使用 Facebook 和 Google 等外部提供商配置了 IdentityServer4。还为注册、登录和其他内容添加了默认 UI。我的问题是如何使用 id_token 重定向到页面? 现在我的流程是:

  1. 打开Identity/Account/Login;
  2. 点击 Facebook;
  3. POST /Identity/Account/ExternalLogin
  4. 重定向到 https://www.facebook.com/v4.0/dialog/oauth?client_id=xxx;
  5. 重定向到 /signin-facebook?code=
  6. 现在我被重定向到 /Identity/Account/ExternalLogin?returnUrl=%2F&handler=Callback

如何配置从第 5 步重定向到特定页面,而不是 /Identity/Account/ExternalLogin?returnUrl=%2F&handler=Callback? 我的前端需要它才能通过 oidc-client 继续使用 API。

我在 3.10 视频的 Securing Angular Apps with OpenID and OAuth2 pluralsight 课程中看到它,但 Brian Noyes 没有使用外部提供商。

第 2-6 步是针对 Identity Server 应用程序,而不是您的客户端应用程序。单击 Facebook 登录时,用户将被重定向到 facebook 的登录页面并输入凭据,facebook 将 return 代码(如果使用代码流)到身份服务器应用程序,然后身份服务器应用程序将发送一个 post使用交换 id token/access 令牌的代码请求 facebook 的令牌端点,在身份服务器应用程序获取 id 令牌后,它将解码令牌并获取用户的声明,然后创建身份服务器自己的令牌,最后 return 到您的客户端应用程序 .

身份服务器将在 ExternalLogin 方法中处理外部登录,您不能在身份验证流程中中断向您的客户端发送 return ID 令牌。如果需要facebook的ID token,可以把代码缓存在ExternalLogin方法中,最后return到客户端app,比如把token添加到token response中。检查 并检查它是否有帮助。

更新:

要在 ExternalLogin 的 Callback 函数中获取 id token,您可以尝试以下步骤:

  1. 在 Identity Server 的 Facebook 登录配置 AddOpenIdConnect 中设置 options.SaveTokens = true;

  2. Callback函数中使用以下代码获取id令牌:

    var result = await HttpContext.AuthenticateAsync(IdentityServer4.IdentityServerConstants.ExternalCookieAuthenticationScheme);
    
    var tokens = result.Properties.GetTokens();
    var idToken = tokens.Where(x => x.Name.Equals("id_token")).FirstOrDefault().Value;