Чтобы создать безопасный механизм аутентификации, вы должны использовать как клиентские сертификаты, так и имя пользователя/пароль. Причина в том, что сертификат — это то, что можно украсть (скопировать), а пароль — это то, что известно только человеку. Альтернативой может быть сертификат на смарт-карте, защищенный PIN-кодом.
Чтобы использовать клиентские сертификаты в приложениях ASP.NET, вам необходимо сделать следующее:
Шаг 1. В диспетчере IIS откройте свое приложение или веб-сайт, выберите «Настройки SSL» и выберите «Требовать SSL» и «Требовать сертификат клиента».
Теперь, когда пользователь открывает ваш веб-сайт, браузер предложит ему выбрать сертификат клиента, который будет использоваться при общении.
Важно На этом этапе вы должны убедиться, что сертификат выдан кем-то, кому вы доверяете (поскольку любой может создавать свои собственные самозаверяющие сертификаты).
Шаг 2. Добавьте элемент конфигурации (web.config, базу данных и т. д.). В этот список вы должны добавить отпечатки всей цепочки ЦС (центров сертификации) для ваших клиентских сертификатов.
<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.");
Только когда и пароль, и сертификат проверены, пользователь должен быть допущен в систему.
person
Knaģis
schedule
05.03.2013