Как вход в Google в аутентификации ядра asp.net связан с обработчиком Google? - PullRequest
0 голосов
/ 25 октября 2018

Я вошел в исходный код, но не вижу, где он связан с обработчиком.В файле GoogleExtensions.cs я вижу

 => builder.AddOAuth<GoogleOptions, GoogleHandler>(authenticationScheme,
                                                   displayName, configureOptions);

Но я не понимаю, как маршрут "/ signin-google" вызывает обработчик.

1 Ответ

0 голосов
/ 25 октября 2018

Как вход в Google в аутентификации ядра asp.net связан с обработчиком Google?

Вопрос можно разделить на два небольших вопроса.

  1. Как пользователь перенаправляется на URL /signin-google
  2. Как 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 работа:

  1. При поступлении входящего запроса AuthenticationMiddleware (который зарегистрирован UseAuthentication() в вашем Configure() методе Startup.cs) будет проверятькаждый запрос и попытаться аутентифицировать пользователя.

  2. Поскольку вы настроили службы аутентификации для использования аутентификации Google, AuthenticationMiddleware будет вызывать метод GoogleHandler.HandleRequestAsync()

  3. При необходимости 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
    }
}

Закрытие

Весь рабочий процесс будет:

  1. Пользователь нажимает кнопку для входа в систему с Google
  2. Google аутентифицирует пользователя и перенаправляет его на /signin-google
  3. Поскольку путь == signin-google, промежуточное ПО будет использовать HandleRequestAsync() для обработки текущего запроса и обмена кодом с Google.
  4. ... делай другие вещи
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...