DotNetOpenID - поставщик удостоверений за брандмауэром - PullRequest
1 голос
/ 02 августа 2010

Глядя на протокол OpenID, выясняется, что проверяющая сторона должна отправить запрос поставщику удостоверений.В нашей ситуации это не совсем идеально, поскольку провайдер идентификации находится за брандмауэром - наш сервер не сможет выполнить запрос.Однако пользователь, имеющий доступ к нашему веб-сайту (на стороне клиента, например, JavaScript или перенаправления), сможет это сделать.Поэтому мой вопрос таков: поддерживает ли OpenID провайдера идентификации за брандмауэром?Если нет, есть ли безопасный способ сделать это?

РЕДАКТИРОВАТЬ:

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

Ответы [ 4 ]

2 голосов
/ 03 августа 2010

Доверяющие стороны OpenID должны иметь возможность убедиться, что полученное пользователем подтверждение действительно от поставщика OpenID.В противном случае ваш RP широко открыт для простых атак.

Традиционно проверка подписи требует, чтобы RP-сервер напрямую связывался с OP-сервером.Поскольку в вашем случае это невозможно, единственной альтернативой является жесткое кодирование общего секрета связи между RP и OP.Вы создаете дескриптор ассоциации и криптографически надежный секрет для этой ассоциации, и сообщаете об этом RP и OP и о том, что она никогда не истекает.Затем каждый запрос на аутентификацию, отправляемый вашим RP, должен запрашивать у OP использование этого конкретного дескриптора ассоциации.
Конечно, ассоциация, срок действия которой никогда не истекает, несет собственные риски безопасности.Вы можете уменьшить это (частично), убедившись, что это ассоциация HMAC-SHA256, а не просто HMAC-SHA1.

Наконец, для обнаружения идентификатора пользователя обычно требуется прямое HTTP-соединение от RP к OP, но это может быть легкоизбежать использования делегирования идентификаторов (установите идентификаторы на сервере без брандмауэра, который указывает на OP за брандмауэром).В качестве альтернативы, ваше решение для результатов обнаружения с жестким кодированием, включая OP Endpoint, тоже подойдет для специализированного решения.Вы должны быть осторожны, чтобы заблокировать все угрозы безопасности, которые это открывает (например, удостовериться, что идентификатор действительно из набора URL, который вы жестко кодируете, иначе люди могут подделать идентификаторы из других конечных точек OP.

Поскольку вы используете DotNetOpenAuth, вы можете создать собственный класс IDirectWebRequestHandler и установить его в свойстве OpenIdRelyingParty.Channel.WebRequestHandler. Этот обработчик будет иметь возможность перехватывать исходящие HTTP-запросы к [server-behind-брандмауэр] и «перенаправить» запрос, просто синтезируя свой собственный HTTP-ответ, то есть XRDS, который сервер за брандмауэром выдаст, если вы только сможете достичь его. Для каждого OP должно быть только два документа XRDS (один - OPИдентификатор, а другой - все заявленные идентификаторы, которые утверждает OP). Это должно обеспечить правильную работу вашего обнаружения как до, так и после аутентификации.

0 голосов
/ 08 апреля 2014

Более чистая альтернатива, чем жесткое кодирование общего секретного связывания между RP и OP, попробуйте использовать ADFS, либо Azure, либо локально, с STS, указывающим на ваш OpenID

0 голосов
/ 03 августа 2010

Обнаружено, что существует способ создания RP на стороне клиента, используя его в качестве примера кода: code.google.com/p/openid-selector. Я изменил код в соответствии с нашей ситуацией, и он, кажется, работает. Предостережение заключается в том, что вы не используете автообнаружение, а вместо этого обязаны жестко закодировать конечную точку (что вполне приемлемо в моей ситуации).

0 голосов
/ 02 августа 2010

Ваш вопрос мне не понятен.

Если клиент может получить доступ к провайдеру, который находится за брандмауэром, сервер также должен - он подключается к тому же порту, используя тот же метод, что и клиент.

Если поставщик недоступен извне, он бесполезен, как и любой другой недоступный сервер.

Если ваша доверяющая сторона не может установить исходящие соединения с сервером, то ничего не поделаешь - должен быть хотя бы один прямой запрос от RP к OP.

В итоге: да, проверяющая сторона должна иметь возможность подключиться к поставщику.

...