基于Cookie的外部身份提供程序登录和令牌委派的单页应用程序

时间:2017-04-21 02:37:01

标签: asp.net-mvc identityserver4 oidc-client-js

如何使用第三方开放ID连接提供商(如Google或Microsoft)为单页应用程序创建无缝登录流,然后从外部提供商返回的现有提供商生成新的jwt令牌而不刷新页面?

例如,我希望用户能够登录Google,然后返回到我使用IdentityServer4验证令牌服务器端的站点,然后提取某些声明并生成新的JWT(我自己的逻辑)。

是否有现有的IdentityServer4端点在重定向中验证来自Open Id Providers的JWT令牌,然后是注入我自己的令牌创建流程的最佳方法是什么?最终的结果是一个理想的cookie,其中包含我的新JWT令牌,现在将在我的SPA发出的每个http请求中发送。

我最好的猜测是使用oidc js客户端并为Google设置用户管理器,例如:

var mgr = new Oidc.UserManager({
    authority: "https://accounts.google.com/.well-known/openid-configuration",
    client_id: "---",
    redirect_uri: "http://localhost:60720/account/callback",
    response_type: "id_token token",
    scope: "openid profile email",
    post_logout_redirect_uri: "http://localhost:60720/spa",
});

/*...*/
mgr.signinRedirect();

但是,在重定向上,我需要Google向我的控制器发送一个cookie,然后使用IdentityServer验证令牌,提取一些声明,如用户ID,然后为我的API生成一个新令牌。这假设我使用IdentityServer来托管我自己的身份提供者。如何使用IdentityServer4完成最后一部分?

这对于MVC模式很简单,因为在调用重定向回调之后,会在帖子后面生成令牌。在SPA中,应该有最小的重定向,理想情况下,没有显示弹出窗口以允许用户登录然后SPA接管。我一直无法弄清楚如何从外部身份提供商重定向到我的IdentityServer4 auth服务器或MVC服务器,并生成一个新令牌,同时对事实配置的干扰最小。

Google建议服务器必须验证令牌(https://developers.google.com/identity/protocols/OAuth2UserAgent#validate-access-token)。一种可能的解决方案是在验证后在重定向回调中生成我的新令牌。但是,IdentityServer4是不是应该验证令牌,还是我必须自己在服务器上执行此操作? IdentityServer4在令牌验证中扮演的角色是什么。我不想自己动手编写这一步。

1 个答案:

答案 0 :(得分:0)

我最终使用Identity Server端点创建自己的授权类型,只是为了将第三方身份验证cookie交换为基于内部JSON-bearer的令牌。