Как вход в Google в аутентификации ядра asp.net связан с обработчиком Google?
Вопрос можно разделить на два небольших вопроса.
- Как пользователь перенаправляется на URL
/signin-google
- Как
GoogleHandler
обрабатывает запрос на /signin-google
Как пользователь перенаправляется на signin-google
Первоначально, когда пользователь нажимает кнопку Google
для входа в систему с помощью Google Authentication, браузер отправляет запрос по следующему URL:
https://your-server/Identity/Account/ExternalLogin?returnUrl=%2F
Ваш сервер просто перенаправляет пользователя на Google.com и запрашиваетGoogle для аутентификации текущего пользователя:
https://accounts.google.com/o/oauth2/v2/auth?
response_type=code
&client_id=xxx
&scope=openid%20profile%20email
&redirect_uri=https%3A%2F%2Fyour-server%2Fsignin-google
&state=xxx
Когда Google успешно аутентифицировал пользователя, он перенаправит пользователя на ваш сайт с параметром code
в соответствии с redirect_uri
выше.
https://your-server/signin-google?
state=xxx
&code=yyy
&scope=zzz
&authuser=0
&session_state=abc
&prompt=none
Примечание путь здесь равен /signin-google
. Это первая ключевая точка.
Как GoogleHandler
обработать signin-google
Прежде чем мы поговоримо том, как GoogleHandler
идет, мы должны посмотреть, как AuthenticationMiddleware
and AuthenticationHanlder
работа:
При поступлении входящего запроса AuthenticationMiddleware
(который зарегистрирован UseAuthentication()
в вашем Configure()
методе Startup.cs
) будет проверятькаждый запрос и попытаться аутентифицировать пользователя.
Поскольку вы настроили службы аутентификации для использования аутентификации Google, AuthenticationMiddleware
будет вызывать метод GoogleHandler.HandleRequestAsync()
При необходимости GoogleHandler.HandleRequestAsync()
, а затем обрабатывают удаленную аутентификацию по протоколу OAuth2.0 и получают идентификационные данные пользователя.
Здесь GoogleHandler
наследуется от RemoteAuthenticationHandler<TOptions>
, и его HandleRequestAsync()
метод будет использоваться AuthenticationMiddleware
для определения необходимости обработки запроса. .Когда он возвращает true
, это означает, что текущий запрос уже обработан обработчиком аутентификации, и дальнейший процесс выполняться не будет.
Так как же HandleRequestAsync()
определяет, должен ли запрос обрабатыватьсясам по себе?
Метод HandleRequestAsync()
просто проверяет текущий путь по Options.CallbackPath
.См. Исходный код ниже:
public abstract class RemoteAuthenticationHandler<TOptions> : AuthenticationHandler<TOptions>, IAuthenticationRequestHandler
where TOptions : RemoteAuthenticationOptions, new()
{
// ...
public virtual Task<bool> ShouldHandleRequestAsync()
=> Task.FromResult(Options.CallbackPath == Request.Path);
public virtual async Task<bool> HandleRequestAsync()
{
if (!await ShouldHandleRequestAsync())
{
return false;
}
// ... handle remote authentication , such as exchange code from google
}
}
Закрытие
Весь рабочий процесс будет:
- Пользователь нажимает кнопку для входа в систему с Google
- Google аутентифицирует пользователя и перенаправляет его на
/signin-google
- Поскольку путь ==
signin-google
, промежуточное ПО будет использовать HandleRequestAsync()
для обработки текущего запроса и обмена кодом с Google. - ... делай другие вещи