Ответ 1
Чтобы создать механизм безопасной аутентификации, вы должны использовать как клиентские сертификаты, так и имя пользователя/пароль. Причина в том, что сертификат - это то, что можно украсть (скопировать), но пароль - это то, что известно только человеку. Альтернативой может быть сертификат на смарт-карте, защищенный 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.");
Только когда оба пароля и сертификат были проверены, пользователь должен быть разрешен в системе.