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



我正在使用IdentityServer4。我已经配置了谷歌身份验证中间件,如下所示。但是,在谷歌注册的重定向 URI 是<domain>/signin-google.此外,我知道在我向Google进行身份验证后以及在Google注册的重定向URI被调用(/signin-google)之后,ExternalLoginCallback端点被调用。

我的问题是,在/signin-google/ExternalLoginCallback召唤之间会发生什么?一旦浏览器被重定向到/signin-google,但在应用程序/中间件最终进入/ExternalLoginCallback之前,谷歌中间件中的哪些方法会被触发?

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

所有外部身份验证提供程序中间件都以这种方式工作。一旦中间件被触发,就会触发一个在OAuthHandler中称为HandleRemoteAuthentication的方法。看这里。这将触发 OAuth 2.0 授权代码流流程的第二段,在该流程的第一段中获取的一次性使用代码将交换为访问令牌。该过程发生在触发 ExternalLoginCallback 之前。具体来说,一旦代码被交换为访问令牌并从谷歌获得一些用户信息,就会创建一个ClaimsPrincipal并发出一个临时cookie。默认情况下,Cookie 名为idsrv.external。然后,正如你在 IdentityServer4 快速入门项目中所看到的那样,将触发 ExternalLoginCallback 终结点,删除idsrv.externalcookie,并为ClaimsPrincipal发出新的身份验证 cookie。

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

最新更新