带有 SPA 和 hellojs 的 IdentityServer4

IdentityServer4 with SPA and hellojs

我基于 dotnet 新模板 "IdentityServer4 Quickstart UI (UI assets only)" (is4ui) 创建了一个 IdentityServer。

这与服务器呈现的 MVC 应用程序配合使用效果很好,但我无法使用 hellojs 使其与 SPA 配合使用。

我正在摆弄 url 以显示来自 Identity Server 的登录页面。登录逻辑 运行 很好,但我认为缺少任何一点,无法使用访问令牌正确重定向到我的客户端应用程序。

这是我用来初始化 hellojs 的代码:

const AuthorityUrl = 'http://localhost:5000';
hello.init({
  'openidconnectdemo': {
    oauth: {
      version: '2',
      auth: AuthorityUrl + '/Account/Login',
      grant: AuthorityUrl + '/Grant'
    },
    scope_delim: ' '
  }
});

hello.init({
  openidconnectdemo: this.authConfig.clientId
});

这是登录码

hello.login('openidconnectdemo', {
  redirect_uri: this.authConfig.redirectUrl,
  scope: `openid profile`,
  response_type: 'token',
  display: 'page',
});

在 AccountController 的这段代码中,Identity Server 尝试重定向到应用程序,但由于 ReturnUrl 为空而失败:

                if (Url.IsLocalUrl(model.ReturnUrl))
                {
                    return Redirect(model.ReturnUrl);
                }
                else if (string.IsNullOrEmpty(model.ReturnUrl))
                {
                    return Redirect("~/");
                }
                else
                {
                    // user might have clicked on a malicious link - should be logged
                    throw new Exception("invalid return URL");
                }

我是否必须修改 Identity Server 才能让它们协同工作,或者客户端是否缺少某些内容?

感谢您的建议!

我可能会推荐使用 oidc-client-js,因为它是 OIDC 的完整实现,应该更容易上手。

也就是说,您的第一个问题似乎是 auth URL 应该指向授权端点而不是登录 UI - 即它应该是 /connect/authorize而不是 /account/login