Чтобы создать безопасный механизм аутентификации, вы должны использовать как клиентские сертификаты, так и имя пользователя/пароль. Причина в том, что сертификат - это то, что можно украсть (скопировать), но пароль - это то, что известно только человеку. Альтернативой может быть сертификат на смарт-карте, защищенный PIN-кодом.
Для использования клиентских сертификатов в приложениях ASP.NET вам нужно сделать следующее:
Шаг 1: В диспетчере IIS откройте приложение или веб-сайт, выберите Настройки SSL и выбрать оба Требовать SSL и требуют Клиентский сертификат.
Теперь, когда пользователь открывает ваш веб-сайт, браузер предложит ему выбрать сертификат клиента, который будет использоваться в сообщении.
Важная информация На этом этапе вы должны убедиться, что сертификат выдан кому-то, кому вы доверяете (поскольку каждый может создавать свои собственные самозаверяющие сертификаты).
Шаг 2: Добавить элемент конфигурации (либо web.config, базу данных и т. Д.). В этом списке вы добавите отпечатки всей цепочки CA (центра сертификации) для своих клиентских сертификатов.
<add key="ClientCertificateIssuerThumbprints" value="4901f5b87d736cd88792bd5ef7caee91bf7d1a2b,0113e31aa85d7fb02740a1257f8bfa534fb8549e,c9321de6b5a82666cf6971a18a56f2d3a8675602"/>
Шаг 3: Создать классический имя пользователя/пароль для входа в страницу. Проверьте имя пользователя/пароль.
Шаг 4: Добавьте следующий код на страницу входа в систему:
var x509 = new X509Certificate2(this.Request.ClientCertificate.Certificate);
var chain = new X509Chain(true);
chain.ChainPolicy.RevocationMode = X509RevocationMode.Offline;
chain.Build(x509);
var validThumbprints = new HashSet<string>(
System.Configuration.ConfigurationManager.AppSettings["ClientCertificateIssuerThumbprints"]
.Replace(" ", "").Split(',', ';'),
StringComparer.OrdinalIgnoreCase);
// if the certificate is self-signed, verify itself.
for (int i = chain.ChainElements.Count > 1 ? 1 : 0; i < chain.ChainElements.Count; i++)
{
if (!validThumbprints.Contains(chain.ChainElements[i].Certificate.Thumbprint))
throw new UnauthorizedAccessException("The client certificate selected is not authorized for this system. Please restart the browser and pick the certificate issued by XXXXX");
}
// certificate Subject would contain some identifier of the user (an ID number, SIN number or anything else unique). here it is assumed that it contains the login name and nothing else
if (!string.Equals("CN=" + login, x509.Subject, StringComparison.OrdinalIgnoreCase))
throw new UnauthorizedAccessException("The client certificate selected is authorized for another user. Please restart the browser and pick another certificate.");
только тогда, когда и пароль и сертификат были проверены, пользователь должен иметь возможность в системе.
В чем смысл сертификата, если клиент может его экспортировать и установить там, где он хочет? Имя пользователя/пароль гарантирует мне достоверность пользователя, но мне также необходимо убедиться в подлинности машины. – enb081
Сертификат может быть установлен так, что частные ключи (необходимые для аутентификации) не могут быть экспортированы. Некоторые ноутбуки позволяют устанавливать сертификаты в аппаратный чип. Альтернативой будет сохранение сертификата на смарт-карте. –
Если вы достаточно находите сертификат клиента, вы используете его для аутентификации: http://www.iis.net/configreference/system.webserver/security/authentication/iisclientcertificatemappingauthentication – flup