Ошибка аутентификации OpenId - PullRequest
0 голосов
/ 17 января 2011

Я реализовал аутентификацию OpenId некоторое время назад, и для запоминания пользователей я использовал ClaimedIdentifier (в терминах DotNetOpenAuth) - строку, возвращаемую поставщиком OpenId после аутентификации.

Но внезапно я понял, что это решение имеет уязвимость,Давайте представим, что есть провайдер OpenId 1, который возвращает идентифицированный «identifier1» для пользователя 1. Теперь, если я знаю этот идентификатор, я могу запустить свой собственный провайдер OpenId и вернуть тот же идентификатор - так что я смогу войти под пользователем 1.

Теперь я думаю о сохранении openid_identifier (URL-адрес провайдера OpenId) + ClaimedIdentifier.

Правильно ли я думаю?Разве я не пропустил еще одну возможную уязвимость?

1 Ответ

2 голосов
/ 17 января 2011

Эта уязвимость, о которой вы думали, на самом деле не является уязвимостью. Сам протокол OpenID (и, следовательно, библиотека DotNetOpenAuth) включает защиту от произвольного поставщика OpenID, утверждающего идентификатор, который ему не принадлежит. Так что нет, вам не только нужно хранить конечную точку OP (то, что вы называли URL-адрес провайдера OpenId) вместе с заявленным идентификатором, но если вы это сделаете, вы потеряете часть гибкости OpenID.

Вы можете спросить в этот момент, так как это тогда работает? Почему это не уязвимость?
Ответ исходит из того факта, что каждый раз, когда поставщик (OP) утверждает заявленный идентификатор проверяющей стороне (RP), RP не просто доверяет OP. У него нет причин доверять OP, потому что, как вы сказали, любой может установить произвольный OP. Вместо этого RP берет заявленный идентификатор и выполняет его обнаружение. По сути, RP спрашивает заявленный идентификатор "имеет ли OP foo.com право утверждать вашу личность?" Только истинный OP для данного заявленного идентификатора сможет получить идентификатор, чтобы ответить «да» на этот вопрос. Ответ «нет» приведет к тому, что RP отклонит утверждение и сообщит пользователю, что во время аутентификации произошла ошибка.

...