DotNetOpenAuth RP не работает за устройством SSL - PullRequest
7 голосов
/ 09 июля 2010

У меня проблемы с настройкой DNOA RP, работающей за устройством SSL (разрывает HTTPS-соединение клиента и обратный прокси-сервер HTTP к веб-серверу за ним).

Проблема в том, что RP неправильно угадывает конечную точку получателя из входящего запроса (поскольку он не HTTPS к тому времени, когда он обращается к веб-серверу) и сравнивает конечную точку со схемой в URL return_to (который - это HTTPS) - происходит сбой при трассировке стека ниже. Я немного разбирался в коде и не вижу способа изменить это поведение без пользовательской сборки или нетривиального подкласса. Я уже передаю HTTPS-версию Realm и ReturnToUrl в OpenIdRelyingParty.CreateRequests () - эта часть работает нормально.

Можно ли перетаскивать обнаруженную схему получателей в HTTPS или пропустить сравнение схем в стандартной сборке DNOA, или я завтра исправляю пользовательскую сборку?


StackTrace:

ERROR DotNetOpenAuth.Messaging - 09 Jul 2010 00:11:39,450 - Protocol error: The openid.return_to parameter (https://XXX/Login.aspx?openid=XXX&dnoa.userSuppliedIdentifier=XXX) does not match the actual URL (http://XXX/Login.aspx?openid=XXX&dnoa.userSuppliedIdentifier=XXX&openid.ns=http://specs.openid.net/auth/2.0&openid.mode=id_res&openid.op_endpoint=XXX&openid.response_nonce=XXX&openid.return_to=https://XXX/Login.aspx?openid=XXX&dnoa.userSuppliedIdentifier=XXX&openid.assoc_handle=XXX&openid.signed=op_endpoint,claimed_id,identity,return_to,response_nonce,assoc_handle&openid.sig=XXX&openid.identity=XXX&openid.claimed_id=XXX) the request was made with.
 at DotNetOpenAuth.Messaging.ErrorUtilities.VerifyProtocol(Boolean condition, String message, Object[] args)
 at DotNetOpenAuth.OpenId.Messages.IndirectSignedResponse.VerifyReturnToMatchesRecipient()
 at DotNetOpenAuth.OpenId.Messages.IndirectSignedResponse.EnsureValidMessage()
 at DotNetOpenAuth.Messaging.MessageSerializer.Deserialize(IDictionary`2 fields, MessageDictionary messageDictionary)
 at DotNetOpenAuth.Messaging.Reflection.MessageDictionary.Deserialize(IDictionary`2 fields)
 at DotNetOpenAuth.Messaging.Channel.Receive(Dictionary`2 fields, MessageReceivingEndpoint recipient)
 at DotNetOpenAuth.Messaging.Channel.ReadFromRequestCore(HttpRequestInfo request)
 at DotNetOpenAuth.Messaging.Channel.ReadFromRequest(HttpRequestInfo httpRequest)
 at DotNetOpenAuth.OpenId.RelyingParty.OpenIdRelyingParty.GetResponse(HttpRequestInfo httpRequestInfo)
 at DotNetOpenAuth.OpenId.RelyingParty.OpenIdRelyingParty.GetResponse()

1 Ответ

9 голосов
/ 13 июля 2010

DotNetOpenAuth имеет встроенную поддержку устройств SSL, когда они добавляют эти специальные заголовки HTTP к перенаправленному запросу HTTP: X_FORWARDED_PROTO и / или HTTP_HOST. Когда они присутствуют, автоопределение внешнего URL-адреса является правильным. Если вы можете настроить свое устройство SSL для этого, это, вероятно, лучший вариант.

Альтернативой является вызов OpenIdRelyingParty.GetResponse(HttpRequestInfo) вместо перегрузки, которая не принимает параметров. Вы сами создаете HttpRequestInfo, используя внешний URL, который, как вы знаете, является реальным. Тогда логика сопоставления URL-адресов внутри DotNetOpenAuth не выполнит запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...