Параметр состояния DotNetOpenAuth OAuth2.0

Я использую DotNetOpenAuth для подключения к Facebook и Google через OAuth2. Спецификации OAuth требуют, чтобы в запросе _uri не предоставлялись никакие дополнительные параметры, и Google фактически применяет это в некоторой степени, заставляя указывать точный uri обратного вызова, когда вы определяете с ними свое приложение Google.

Чего я хочу добиться, так это иметь возможность вернуть пользователя на определенный URL-адрес после того, как он прошел аутентификацию в Facebook или Google. Поток такой,пользователь нажимает на защищенную ссылку, он перенаправляется на мою страницу входа с параметром returnUrl, а затем я запускаю процесс авторизации на основе выбранного сервера авторизации OAuth2.

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

Способ исправить это — использовать параметр «состояние», который сервер авторизации отправит обратно в запрос _uri, но я не могу найти способ указать это с помощью DotNetOpenAuth.

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

Это код из PrepareRequestUserAuthorization:

            // Mitigate XSRF attacks by including a state value that would be unpredictable between users, but
        // verifiable for the same user/session.
        // If the host is implementing the authorization tracker though, they're handling this protection themselves.
        if (this.AuthorizationTracker == null) {
            var context = this.Channel.GetHttpContext();
            if (context.Session != null) {
                request.ClientState = context.Session.SessionID;
            } else {
                Logger.OAuth.WarnFormat("No request context discovered, so no client state parameter could be set to mitigate XSRF attacks.");
            }
        }

WebServerClient.cs. Здесь нет другого блока, и я ожидал, что смогу подыграть и подключить свои собственные данные.

Любые советы о том, что мне не хватает?

6
задан Ameen 17 July 2012 в 20:20
поделиться