Избегайте ограничения "должен содержать период" в URL-адресах dotnetopenauth

Исходная информация (которая может быть уже очевидна из множества вопросов, которые я задавал о DNOA до сих пор): я работаю над порталом веб-приложений, работающим во внутренней сети моего работодателя. Однако, поскольку это интрасеть, все различные проверяющие стороны (и поставщик) имеют URL-адреса, которые выглядят следующим образом: http://servername/path; особенно отсутствует TLD.

Этот код в DotNetOpenAuth (UntrustedWebRequestHandler.IsUriAllowable(Uri uri)) выполняет следующую проверку:

if (!uri.Host.Contains(".")) {
    return failsUnlessWhitelisted("it does not contain a period in the host name.");
}

Очевидно, что все мои RP являются просто именами серверов без TLD, и все они не проходят эту проверку. Теперь я понимаю, что могу просто добавить их все в белый список web.config (который я пробовал несколько раз, и он работает как положено), но, учитывая, что новые серверы будут добавляться динамически, я не вижу в этом идеала решение.

Итак, мой вопрос: я должен пытаться динамически изменять web.config? (предварительное исследование, которое я провел по этому вопросу, указывает на боль). Или есть какой-то способ программно установить белый список?

1 ответ

Решение

К сожалению, нет никакого программного способа изменить белый список хостов.

Если вы находитесь в надежной среде, вы можете обойти UntrustedWebRequestHandler Класс и использовать обработчик веб-запросов, который не включает проверку имени хоста (или проверяет, что он соответствует любой политике, что вам нужно). Есть встроенный DotNetOpenAuth.Messaging.StandardWebRequestHandler вы можете использовать это как прямой проход (без добавления дополнительных проверок безопасности на уровне сети), который рекомендуется, если вы доверяете всем серверам, к которым вы обращаетесь с просьбой подключиться к DotNetOpenAuth.

var rp = new OpenIdRelyingParty();
rp.Channel.WebRequestHandler = new StandardWebRequestHandler();

var op = new OpenIdProvider();
op.Channel.WebRequestHandler = new StandardWebRequestHandler();

Если вы хотите применить более осторожную политику (возможно, иметь некоторый централизованный список хостов из белого списка), вы можете реализовать IDirectWebRequestHandler себя, и вы можете использовать существующие UntrustedWebRequestHandler класс для вдохновения, если это необходимо. Затем, конечно, установите вышеуказанные свойства для вашей собственной реализации.

Другие вопросы по тегам