DotNetOpenAuth OpenID Flow с собственным сервером Auth

Мне сложно найти ответы на сценарий, который я должен реализовать, используя DotNetOpenAuth и конкретный поток, с которым мне приходится иметь дело.

На графике ниже я контролирую как сайт MVC, так и API. API - это мой сервер авторизации и мой сервер ресурсов.

Имя пользователя и поток паролей

Процесс довольно очевиден в случае, когда пользователь создал локальную учетную запись в моей системе, поскольку я имею дело с именами имени пользователя и пароля, чтобы зарегистрировать их на сайте, который затем я могу передать в мою конечную точку Token и, перейдите к HandleTokenRequest моего сервера авторизации, чтобы получить токены доступа и обновить токены для моего клиента, чтобы затем начать доступ к ресурсам.

OpenID Flow

Поток, с которым я нахожусь в настоящее время, заключается в том, что пользователь решает войти на мой сайт, используя свои учетные данные Google (например). В этом случае я могу предоставить им токены доступа и обновить токены с моего собственного сервера авторизации в моем API?

Что бы я включил в запрос к моей конечной точке токена API?

Я написал свой собственный клиент API, который наследуется от класса WebServerClient, который является частью библиотеки DotNetOpenAuth.

Я видел, что есть интерфейс, предназначенный для обработки токенов под названием IServiceProviderTokenManager, но который, по-видимому, используется в сценариях поставщика OpenID, а не в реализации клиента API как мой, поэтому я предполагаю, что мне нужно написать пользовательский класс для хранения и извлечения моих собственных токенов API на стороне клиента, но также хотел бы это подтвердить?

Стоит отметить, что и веб-сайт, и API имеют полный доступ к одной и той же базе данных безопасности, но только API имеет доступ к базе данных, где хранятся какие-либо ресурсы. Shows a set of flows using either local account with username and password or an openid provider

Ответ 1

Просто для полноты я подумал, что обновляю этот вопрос своим ответом.

То, что я закончил, заключалось в перемещении конечных точек Authorize и Token в мое приложение MVC 4, а не в самих API.

Таким образом, при вызове конечной точки авторизации с зарегистрированным пользователем (при наличии существующего файла cookie ASP.NET FormsAuthentication) можно получить код авторизации, предоставленный, когда обработка запроса попадает в этот код:

        // Consider auto-approving if safe to do so.
        if (((OAuth2AuthorizationServer)this.authorizationServer.AuthorizationServerServices).CanBeAutoApproved(pendingRequest))
        {
            var approval = this.authorizationServer.PrepareApproveAuthorizationRequest(pendingRequest, HttpContext.User.Identity.Name);
            return this.authorizationServer.Channel.PrepareResponse(approval).AsActionResult();
        }

После того, как у вас есть код авторизации, вы можете позвонить в конечную точку Token с помощью экземпляра WebServerClient и вызвать его метод RequestUserAuthorization.

При повторном вызове вы можете вызвать метод ProcessUserAuthorization, который вернет объект IAuthorizationState с вашим токеном доступа и обновит токен.