2016-03-21 14 views
1

Meine Firma hat eine API geschrieben, um unsere Anwendungsdaten unseren Kunden zugänglich zu machen. Wir haben die Endpunkte fertiggestellt und möchten nun die API sichern. Die API wird nur von vorab genehmigten Clients verwendet, sodass kein anonymer Zugriff erforderlich ist. Mir wurde gesagt, dass wir ein x.509-Zertifikat verwenden können, das wir generieren, um jeden Client zu identifizieren und zu authentifizieren. Mit der Kennzeichnung meine ich, dass ein Client-Code in das Zertifikat eingebettet wird, das wir an jeden Client senden (ist das überhaupt möglich?). Wie Sie wahrscheinlich sagen, ich habe wenig Erfahrung bei der Authentifizierung von Kunden mit Zertifikaten, ist dies ein solider Ansatz?Client-Authentifizierung für WebAPI 2

Antwort

2

Dies ist eine sehr "trickreiche" Möglichkeit zur Authentifizierung und Autorisierung von Clients. Es ist sehr leistungsfähig, aber könnte sehr teuer zu implementieren sein, weil Sie eine volle PKI (öffentliche Schlüsselinfrastruktur) verwalten müssen und Sie sicher die Zertifikate an Ihre Kunden verteilen müssen.

1) Sie müssen SSL vorhanden und Sie müssen es erzwingen (auch global, wenn Sie wollen):

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) Sie müssen IIS konfigurieren Client-Zertifikate througt der application.host Config zu akzeptieren oder mit der IIS-Manager-Konsole:

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

3) auf der Serverseite können Sie das Client-Zertifikat erhalten, indem GetClientCertificate auf die Anforderungsnachricht aufrufen. Die Methode gibt null zurück, wenn kein Clientzertifikat vorhanden ist. Andernfalls wird eine X509Certificate2-Instanz zurückgegeben. Verwenden Sie dieses Objekt, um Informationen aus dem Zertifikat abzurufen, z. B. den Aussteller und den Betreff. Dann können Sie diese Informationen für die Authentifizierung und/oder Autorisierung verwenden.

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

Überprüfen dieser Artikel von Mike Watson für volle reference (Ich habe Ihnen einen Auszug hier).

ist dies ein solider Ansatz?

Ja ist es, aber wie Sie gesehen haben, wie der PKI-Nachteil im Auge behalten. Schließlich können Sie OAuth2 Auth implementieren, das auch extrem leistungsfähig ist und Sie können es einfach auf einem externen Provider, zum Beispiel Azure AD, basieren. Überprüfen Sie this Artikel für weitere Details. BTW, Sie können auch von der grundlegenden MVC/API-Vorlage starten.

+0

Dank Luca, dieser Link zu Mike Watson Artikel war genau das, was ich brauchte. Wir werden unsere eigenen Zertifikate ausstellen, da wir eine begrenzte Gruppe von Clients haben, die die API verwenden werden, so dass der Aufwand für die Sperrung und das Ausstellen neuer Clientzertifikate überschaubar sein sollte. –

Verwandte Themen