27

asp.net アプリケーションがあり、X509 証明書を使用してユーザーを認証する必要があります。つまり、ユーザーは私が発行した証明書をインストールする必要があります。これにより、ユーザーは私の Web サイトを閲覧でき、この証明書によってどのユーザーであるかを識別できます。

IIS で既に SSL を構成しましたが、現在探しているものではなく、どこから始めればよいかわかりません。

どうすればasp.net c#でこれを達成できますか?

4

2 に答える 2

25

安全な認証メカニズムを作成するには、クライアント証明書とユーザー名/パスワードの両方を使用します。その理由は、証明書は盗む (コピーする) ことができるものですが、パスワードはその人だけが知っているものだからです。代替手段として、PIN で保護されたスマートカード上の証明書を使用できます。

ASP.NET アプリケーションでクライアント証明書を使用するには、次の手順を実行する必要があります。

ステップ 1: IIS マネージャーで、アプリケーションまたは Web サイトを開き、[SSL 設定] を選択して、[SSL が必要] と [クライアント証明書が必要] の両方を選択します。

これで、ユーザーが Web サイトを開くと、ブラウザーは、通信で使用されるクライアント証明書を選択するように求めます。

重要この時点で、証明書が信頼できる人によって発行されていることを確認する必要があります (自己署名証明書は誰でも作成できるため)。

ステップ 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.");

パスワードと証明書の両方がチェックされた場合にのみ、ユーザーはシステムで許可されます。

于 2013-03-05T17:58:37.677 に答える
13

IIS 7.0 以降を使用していると仮定すると、クライアント証明書マッピング認証を構成できます。

Active Directory の使用(非常に簡単、マッピング作業は 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>

またはIIS を使用します(IIS でさらに構成が必要で、クライアント証明書にアクセスする必要がありますが、スタンドアロンで動作し、AD へのラウンドトリップはありません)。この場合、(1 つ以上の) ユーザー資格情報を指定し、

  • 指定した資格情報を持つユーザーの証明書の公開鍵に各ユーザーをマップする、または
  • 証明書のフィールドの値に基づいて複数の証明書をユーザーにマップする

構成 (多対 1):

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

(サンプル構成は、非常に精巧な iis.net ドキュメント ページのサンプルから恥知らずにコピーされたものです。)

または、クライアント証明書に基づいてクライアントを認証するセキュリティ トークン サービス (STS) でクレーム ベース認証を使用するようにアプリケーションを構成することもできます。ADFS 2.0 はこの役割を果たすことができます。利用できない場合は、Thinktecture Identity Serverを参照してください。

于 2013-03-11T11:00:52.777 に答える