Để tạo cơ chế xác thực bảo mật, bạn sẽ sử dụng cả chứng chỉ ứng dụng khách và tên người dùng/mật khẩu. Lý do là chứng chỉ là thứ có thể bị đánh cắp (sao chép) nhưng mật khẩu là thứ chỉ được người đó biết đến. Một giải pháp thay thế có thể là chứng chỉ trên thẻ thông minh, được bảo vệ bằng mã PIN.
Để sử dụng giấy chứng nhận của khách hàng trong các ứng dụng ASP.NET bạn cần phải làm như sau:
Bước 1: Trong IIS Manager, mở ứng dụng của bạn hoặc trang web, chọn SSL Settings và chọn cả hai Require SSL và Yêu cầu Chứng chỉ ứng dụng khách.
Bây giờ khi người dùng mở trang web của bạn, trình duyệt sẽ nhắc anh ta chọn chứng chỉ ứng dụng khách sẽ được sử dụng trong giao tiếp.
Quan trọng Tại thời điểm này, bạn phải đảm bảo rằng chứng chỉ được cấp bởi người bạn tin cậy (vì mọi người đều có thể tạo chứng chỉ tự ký của riêng mình).
Bước 2: Thêm mục cấu hình (hoặc web.config, cơ sở dữ liệu, v.v.). Trong danh sách này, bạn sẽ thêm dấu vân tay của toàn bộ chuỗi CA (chứng chỉ authority) cho các chứng chỉ ứng dụng khách của bạn.
<add key="ClientCertificateIssuerThumbprints" value="4901f5b87d736cd88792bd5ef7caee91bf7d1a2b,0113e31aa85d7fb02740a1257f8bfa534fb8549e,c9321de6b5a82666cf6971a18a56f2d3a8675602"/>
Bước 3: Tạo một trang đăng nhập username/password cổ điển. Xác minh tên người dùng/mật khẩu.
Bước 4: Thêm mã sau đây để trang đăng nhập của bạn:
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.");
Chỉ khi nào cả mật khẩu và giấy chứng nhận đã được kiểm tra, người sử dụng nên được cho phép trong hệ thống.
Điểm của chứng chỉ là gì nếu khách hàng có thể xuất nó và cài đặt nó bất cứ nơi nào anh ta muốn? Tên người dùng/mật khẩu đảm bảo cho tôi về tính xác thực của người dùng, nhưng tôi cũng cần đảm bảo tính xác thực của máy. – enb081
Chứng chỉ có thể được cài đặt để không thể xuất khóa riêng tư (yêu cầu để xác thực). Một số máy tính xách tay cho phép bạn cài đặt các chứng chỉ trong một chip phần cứng. Một giải pháp thay thế là lưu trữ chứng chỉ trong thẻ thông minh. –
Nếu bạn tìm thấy chứng chỉ ứng dụng khách đủ, bạn sử dụng nó để xác thực: http://www.iis.net/configreference/system.webserver/security/authentication/iisclientcertificatemappingauthentication – flup