Есть еще один, очень безопасный метод. Это клиентские сертификаты. Знаете, как серверы представляют сертификат SSL, когда вы связываетесь с ними по https? Ну, а серверы могут запросить сертификат у клиента, чтобы они знали, что клиент - это тот, кем они себя называют. Клиенты генерируют сертификаты и передают их вам по безопасному каналу (например, заходя в ваш офис с USB-ключом - предпочтительно не троянским USB-ключом).
Вы загружаете открытый ключ клиентских сертификатов cert (и сертификат (ы) подписывающего лица, если необходимо) на ваш веб-сервер, и веб-сервер не принимает подключения от кого-либо кроме людей, у которых есть соответствующие закрытые ключи для сертификатов, о которых он знает. Он работает на уровне HTTPS, поэтому вы можете даже полностью пропустить аутентификацию на уровне приложений, например, OAuth (в зависимости от ваших требований). Вы можете абстрагировать слой и создать локальный центр сертификации и подписать запросы клиентов на получение сертификатов, что позволяет пропустить шаги «заставить их войти в офис» и «загрузить сертификаты на сервер».
Боль в шее? Абсолютно. Хорошо для всего? Нету. Очень безопасно? Ага.
Однако он полагается на то, что клиенты сохраняют свои сертификаты в безопасности (они не могут публиковать свои закрытые ключи в Интернете), и обычно используется, когда вы продаете услугу клиентам, а не позволяете кому-либо зарегистрироваться и подключиться.
В любом случае, это может быть не то решение, которое вы ищете (возможно, это не совсем честно), но это другой вариант.