Pertanyaan Autentikasi Klien melalui Sertifikat X509 di asp.net


Saya memiliki aplikasi asp.net dan saya perlu mengotentikasi pengguna menggunakan sertifikat X509. Artinya, pengguna harus memasang sertifikat yang dikeluarkan oleh saya sehingga dia dapat menjelajahi situs web saya dan saya dapat mengidentifikasi pengguna mana, dengan sertifikat ini.

Saya sudah mengkonfigurasi SSL pada IIS, tetapi bukan itu yang saya cari saat ini, dan saya tidak tahu harus mulai dari mana.

Bagaimana saya bisa mencapai ini di asp.net c #?


21
2018-02-18 09:52


asal


Jawaban:


Untuk membuat mekanisme otentikasi yang aman, Anda akan menggunakan kedua sertifikat klien dan nama pengguna / kata sandi. Alasannya adalah bahwa sertifikat adalah sesuatu yang dapat dicuri (disalin) tetapi kata sandi adalah sesuatu yang hanya diketahui oleh orang tersebut. Alternatif lain bisa berupa sertifikat pada kartu pintar, dilindungi oleh PIN.

Untuk menggunakan sertifikat klien dalam aplikasi ASP.NET, Anda perlu melakukan hal berikut:

Langkah 1: Di IIS Manager, buka aplikasi atau situs web Anda, pilih Pengaturan SSL dan pilih keduanya Memerlukan SSL dan Membutuhkan sertifikat Klien.

Sekarang ketika pengguna membuka situs web Anda, browser akan memintanya untuk memilih sertifikat klien yang akan digunakan dalam komunikasi.

Penting Pada titik ini Anda harus memastikan bahwa sertifikat dikeluarkan oleh seseorang yang Anda percayai (karena siapa pun dapat membuat sertifikat sendiri yang ditandatangani sendiri).

Langkah 2: Tambahkan item konfigurasi (baik web.config, database, dll.). Dalam daftar ini Anda akan menambahkan cap jempol dari seluruh rantai CA (otoritas sertifikat) untuk sertifikat klien Anda.

<add key="ClientCertificateIssuerThumbprints" value="4901f5b87d736cd88792bd5ef7caee91bf7d1a2b,0113e31aa85d7fb02740a1257f8bfa534fb8549e,c9321de6b5a82666cf6971a18a56f2d3a8675602"/>

Langkah 3: Buat halaman login nama pengguna / kata sandi klasik. Verifikasi nama pengguna / kata sandi.

Langkah 4: Tambahkan kode berikut ke halaman login Anda:

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.");

Hanya ketika kata sandi dan sertifikat telah diperiksa, pengguna harus diizinkan dalam sistem.


20
2018-03-05 17:58



Dengan asumsi Anda memiliki IIS 7.0 atau lebih tinggi, Anda dapat mengkonfigurasi Otentikasi Pemetaan Sertifikat Klien

Menggunakan Active Directory (Sangat mudah, biarkan pemetaan bekerja ke server 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>

Atau menggunakan IIS (Lebih banyak konfigurasi diperlukan di IIS, membutuhkan akses ke sertifikat klien, tetapi bekerja mandiri, tidak ada perjalanan pulang pergi ke AD). Dalam hal ini, Anda menetapkan (satu atau lebih) kredensial pengguna dan

  • memetakan setiap pengguna ke kunci publik sertifikat untuk pengguna yang kredensial yang Anda tentukan, atau
  • memetakan beberapa sertifikat kepada pengguna berdasarkan nilai di bidang sertifikat

Konfigurasi (banyak ke satu):

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

(Contoh konfigurasi agak tanpa malu disalin dari sampel pada halaman dokumentasi iis.net, yang cukup rumit.)

Atau Anda dapat mengonfigurasi aplikasi Anda menggunakan Otentikasi Berbasis Klaim dengan Layanan Token Keamanan (STS) yang mengautentikasi klien berdasarkan sertifikat klien. ADFS 2.0 dapat memenuhi peran ini, atau jika tidak tersedia, Anda bisa melihat Thinktecture Identity Server.


8
2018-03-11 11:00