ASP.NETのでクライアント証明書を使ったログイン認証を行う方法
C#言語のASP.NETのでクライアント証明書を使ったログイン認証を行う方法
クライアント証明書認証とは
WEBシステムを構築する際に、最初に直面する問題のログイン画面。
クライアント証明書を発行する仕組みについては、別の機会に紹介したいと思う。
C#でクライアント証明書を発行する方法はここをクリックWEBシステムのログイン画面は、一般的なアプリケーションのログイン画面と違い、ユーザーがWEBブラウザにURLを直接入力すると、全ての機能にアクセス出来てしまう為、最初に作成するログイン画面のログイン情報を持ち回り、検証し、アクセスを受け入れるか拒否するか等コントロールを行う為、アプリケーションとは異なりとても重要な機能。
今回はそのなかでも、通所のIDやパスワード、2段階認証とは違った、クライアント証明書認証型のログインをコントロールする方法についての紹介。
個人的には、アプリケーション構築をする事が多い為、WEB系のシステム開発に携わる機会は少ない方なのだけれども、久々に触ったら、.NetFramework、.NET COREと大きく分かれていて、アプリケーションサイドでも、WPFのMVVM型や、いつもの三層モデルに、UWPやら、ますます開発手法の多様化が進み、一体どれを選択するのが正解なのか、ベンダー側の宣伝文句だけに振り回されず選択するのが非常に困難になってきた。
今回紹介するやり方は、Framework4.7をチョイスしてみた。
>.NetFramework4.7は、MVCも混在させる事が容易で、WEBFormを選択時でも、URLに.ASPXと付かないなど、より現代のWEBに最適なWEBシステムの構築が可能で、検索エンジンに最適化したい場合はMVC、WEBシステムに特化した機能を作りたい場合は、システム構築の工数を大幅に削減できるWEBFormを使うと言った事が容易で、とても便利であったからだ。
話を戻して、クライアント証明書を簡単に説明すると、WEBページにアクセスする為に、入館証のようなIDカードを必要とする認証機能の事である。
利用者がWEBページにアクセスすると、WEBサーバー側がクライアント証明書を、利用者側に求めてきて、具体的には、下のような、端末にインストールされた証明書を選択する画面が表示される。
サービス提供者が提供していないクライアント証明書を選択すると、[ HTTP Error である 403.16 系」のエラーをサーバー側が返し、クライアント側にはアクセスが拒否された旨の画面が表示される。
クライアント証明書には、有効期限を設定する事も可能。
筆者が考えるセキュアなWEBページ、クライアント証明書とIPアドレスを指定したアクセス許可
ワンタイムパースワード、二段階認証、ワンタイムパスワードを発行するデバイスを使用したログイン等色々あるが、費用を掛けずに割と強固な顧客の個人情報を取り扱うWEBサービスを提供する場合、例えばネットショップの店舗側が店舗メニューにログインする機能を提供する場合は、最低限クライアント証明書認証は仕組みとして持っていた方が安全だと考える。
日本企業が提供するWEBサービスは、セキュリティーよりも利便性ファーストにし過ぎており、サービス提供直後の重大な個人情報の漏洩が非常に多いと感じる。
固定IP化がどうしても出来ないのであれば、最低限サービス提供側が発行したクライアント証明書を利用した認証機能は必須とするべきだと考える。
無料のWEBサーバーを利用している場合は、セキュリティホールがあっても、解決を自身で行わないといけない為、インシデント発生時は即サービスを一度止める覚悟をした上でサービス提供をする事が必要だと考えた方が良いだろう。
最低限下記のような認証機能を当初は持たせている方が安全だと考える。
- クライアント証明書を使用したアクセス許可
- クライアント証明書のシリアル番号等と、ユーザー情報を紐づけマッチングでのログイン画面表示
- アクセス通過後にログインIDとパスワードを利用したログイン画面
固定IPまで出来たら良いが、個人商店のようなところを相手にする場合、固定IPまで持っていない事も、日本のネットショップユーザーは多い為、これが限度だろうと考える。
IIS側の設定
SSL化の対応が終わった後、「SSL設定」の画面を開く。
その後、クライアント証明書の受理または、必須を選択
この設定を行うだけで、WEB利用者がWEBページにアクセスした際、クライアント側にインストールされているクライアント証明書を求める画面が表示される。
ASP.NET側のコード
HttpClientCertificate cert = Request.ClientCertificate;
if (cert.IsPresent && cert.IsValid)
{
//cert.SerialNumber を使って、証明書のシリアル番号等、クライアント証明書系の情報を読み取ることが出来る。
}
開発環境(Visual Studio)でデバッグする場合は、IISExpressの設定が必要
Visual Studioで動作検証をする場合には、IISの設定画面が無い為、[applicationhost.config]を編集して、SSL設定および、クライアント証明書の受理を設定する必要がある事に注意。
<security>
<access sslFlags="Ssl, SslNegotiateCert" />
<applicationDependencies>
<application name="Active Server Pages" groupId="ASP" />
</applicationDependencies>
<security>