IdentityServer4成功验证后,Google中间件如何处理/ signin-google回调?

问题描述:

我正在使用IdentityServer4。我配置了谷歌认证中间件here。但是,在Google注册的redirect uri是<domain>/signin-google。另外,我知道ExternalLoginCallback端点在我通过Google认证并且在Google注册的重定向URI已被调用(/signin-google)后被调用。IdentityServer4成功验证后,Google中间件如何处理/ signin-google回调?

我的问题是在/signin-google和致电/ExternalLoginCallback之间发生了什么?一旦浏览器重定向到/signin-google,但在应用程序/中间件最终到达/ExternalLoginCallback之前,会触发Google中间件中的哪些方法?

如果你看看ASP.NET Core Security Github repo,你可以找到Google middleware的实现。本质上,如果您通过代码追踪,您将看到GoogleHandler继承自OAuthHandler<T>,它继承自RemoteAuthenticationHandler<T>。在RemoteAuthenticationHandler<T>中,您将看到一种称为(here)的方法。此方法检查当前URL与Options对象上CallbackPath属性上的URL。这是身份验证中间件在身份验证提供程序重定向后触发的方式 - 它由中间件处理 - 不是控制器。一旦中间件被触发,它将恢复认证过程。

所有外部认证提供商中间件都以这种方式工作。一旦中间件被触发,在OAuthHandler中被称为HandleRemoteAuthentication的方法被触发。请参阅here。这触发了OAuth 2.0 authorization code flow process的第二段,其中在该过程的第一段中获得的一次性使用代码被交换为访问令牌。该过程发生在ExternalLoginCallback被触发之前。具体来说,一旦代码被交换为访问令牌,并且从Google获得一些用户信息,则创建ClaimsPrincipal并发布临时cookie。默认情况下,Cookie被命名为idsrv.external。然后,您可以在IdentityServer4 Quickstart项目中看到,ExternalLoginCallback端点被触发,idsrv.external Cookie被删除,并为ClaimsPrincipal发出新的身份验证Cookie。

Google中间件覆盖特定于Google的基类的功能,但基本上所有的OAuth 2.0/OpenID Connect中间件都以这种方式工作。