2016-03-21 21 views
1

私の会社は、アプリケーションデータをクライアントに公開するAPIを作成しています。エンドポイントを完成させ、APIを保護したいと考えています。 APIはあらかじめ承認されたクライアントによってのみ使用されるため、匿名アクセスは必要ありません。私は、各クライアントを識別して認証するために生成するx.509証明書を使用できると言われました。私が各クライアントに発行する証明書にクライアントコードを埋め込むことを意味します(これは可能ですか?)。あなたはおそらく私がcertsでクライアントを認証することにほとんど経験がないと言うことができますが、これは堅実なアプローチですか?WebAPIのクライアント認証2

答えて

2

これは、クライアントの認証と承認に非常に「難しい」オプションです。非常に強力ですが、完全にPKI(公開鍵インフラストラクチャ)を管理する必要があり、クライアントにを安全に配布する必要があるため、実装に非常にコストがかかる可能性があります。

1))あなたが代わりにSSLを必要とし、あなたがしたい場合でも、全体的に(それを強制する必要があります。

public class RequireHttpsAttribute : AuthorizationFilterAttribute 
    { 
    public override void OnAuthorization(HttpActionContext actionContext) 
    { 
     if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps) 
     { 
      actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden) 
      { 
       ReasonPhrase = "HTTPS Required" 
      }; 
     } 
     else 
     { 
      base.OnAuthorization(actionContext); 
     } 
    } 
} 

public class ValuesController : ApiController 
{ 
    [RequireHttps] 
    public HttpResponseMessage Get() { ... } 
} 

2)あなたはapplication.host設定througtクライアント証明書を受け入れるようにIISを設定する必要がありますかIISマネージャコンソールを使用して:

<system.webServer> 
    <security> 
     <access sslFlags="Ssl, SslNegotiateCert" /> 
     <!-- To require a client cert: --> 
     <!-- <access sslFlags="Ssl, SslRequireCert" /> --> 
    </security> 
</system.webServer> 

3)サーバー側では、要求メッセージにGetClientCertificateを呼び出すことにより、クライアント証明書を取得することができます。クライアント証明書がない場合、このメソッドはnullを返します。それ以外の場合は、X509Certificate2インスタンスを返します。このオブジェクトを使用して、発行者やサブジェクトなどの証明書から情報を取得します。次に、この情報を認証および/または承認に使用することができます。

X509Certificate2 cert = Request.GetClientCertificate(); 
string issuer = cert.Issuer; 
string subject = cert.Subject; 

(私はあなたがここにエキスを与えた)完全なreference用マイクワトソンのこの記事をチェックしてください。

これは確かなアプローチですか?

はい、それは念頭に置いてPKIの欠点として見ましたが、最終的には非常に強力なOAuth2認証を実装することができ、Exille Azure ADのために、外部プロバイダーに簡単に組み込むことができます。詳細については、thisの記事を参照してください。また、基本的なMVC/APIテンプレートから開始することもできます。

+0

ありがとうLuca、Mike Watsonの記事へのリンクはまさに​​私が必要としていたものでした。 APIを使用するクライアントが限られているため、新しいクライアント証明書の取り消しや発行にかかるオーバーヘッドを管理しなければならないため、独自の証明書を発行する予定です。 –

関連する問題