2013-02-18 41 views
21

Tôi có ứng dụng asp.net và tôi cần xác thực người dùng bằng chứng chỉ X509. Nghĩa là, người dùng phải cài đặt chứng chỉ do tôi cấp để anh ấy có thể duyệt trang web của tôi và tôi có thể xác định người dùng nào, bằng chứng chỉ này.Xác thực ứng dụng khách qua chứng chỉ X509 trong asp.net

Tôi đã định cấu hình SSL trên IIS, nhưng đó không phải là những gì tôi đang tìm kiếm ngay bây giờ và tôi không biết bắt đầu từ đâu.

Làm thế nào tôi có thể đạt được điều này trong asp.net C#?

Trả lời

20

Để 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.

+0

Đ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

+0

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. –

+1

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

8

Giả sử bạn có IIS 7.0 hoặc cao hơn, bạn có thể cấu hình khách hàng Certificate Mapping Xác thực

Using Active Directory (Vô cùng dễ dàng, rời khỏi công việc lập bản đồ đến máy chủ AD)

<location path="Default Web Site"> 
    <system.webServer> 
     <security> 
     <access sslFlags="Ssl, SslNegotiateCert" /> 
      <authentication> 
      <windowsAuthentication enabled="false" /> 
      <anonymousAuthentication enabled="false" /> 
      <digestAuthentication enabled="false" /> 
      <basicAuthentication enabled="false" /> 
      <clientCertificateMappingAuthentication enabled="true" /> 
     </authentication> 
    </security> 
    </system.webServer> 
</location> 

Hoặc using IIS (Xem thêm cấu hình cần thiết trong IIS, cần quyền truy cập vào chứng chỉ ứng dụng khách, nhưng hoạt động độc lập, không có vòng lặp tới AD).Trong trường hợp này, bạn chỉ định (một hoặc nhiều) thông tin người dùng và

  • bản đồ mỗi người dùng để khóa công khai của một Giấy chứng nhận cho người sử dụng mà thông tin bạn chỉ định, hoặc
  • đồ nhiều giấy chứng nhận cho người sử dụng dựa trên các giá trị trong lĩnh vực của giấy chứng nhận

cấu hình (nhiều người một):

<location path="Default Web Site"> 
    <system.webServer> 
     <security> 
     <authentication> 
      <windowsAuthentication enabled="false" /> 
      <anonymousAuthentication enabled="false" /> 
      <digestAuthentication enabled="false" /> 
      <basicAuthentication enabled="false" /> 
      <iisClientCertificateMappingAuthentication enabled="true" 
        manyToOneCertificateMappingsEnabled="true"> 
       <manyToOneMappings> 
        <add name="Contoso Employees" 
         enabled="true" 
         permissionMode="Allow" 
         userName="Username" 
         password="[enc:AesProvider:57686f6120447564652c2049495320526f636b73:enc]"> 
        <rules> 
         <add certificateField="Subject" 
          certificateSubField="O" 
          matchCriteria="Contoso" 
          compareCaseSensitive="true" /> 
        </rules> 
        </add> 
       </manyToOneMappings> 
      </iisClientCertificateMappingAuthentication> 
     </authentication> 
     <access sslFlags="Ssl, SslNegotiateCert" /> 
     </security> 
    </system.webServer> 
</location> 

(cấu hình mẫu chứ không phải không biết xấu hổ sao chép từ các mẫu trên iis.net làm các trang tài liệu, khá phức tạp.)

Hoặc bạn có thể định cấu hình ứng dụng của mình thành use Claims-Based Authentication bằng Dịch vụ mã bảo mật (STS) xác thực khách hàng dựa trên chứng chỉ ứng dụng khách. ADFS 2.0 có thể fullfil vai trò này, hoặc nếu nó không có sẵn, bạn có thể xem Thinktecture Identity Server.