2016-04-26 6 views
2

Ich habe zwei Web-APIs; eine, die öffentlich ist und eine, die intern ist. Ich möchte, dass die Öffentlichkeit mit der internen kommuniziert. Allerdings würde ich zwei Sicherheitsebenen wie für die interne eins:Imitieren von Windows-Benutzer mit AntiForgery Tokens

  • Windows-Authentifizierung (die getan wird)
  • Fälschungstoken (das ist, was ich habe Probleme mit)

im Moment bin ich Erzeugen des AntiForgery Token in der öffentlichen API:

string cookieToken, formToken; 
AntiForgery.GetTokens(null, out cookieToken, out formToken); 
return cookieToken + ":" + formToken; 

ich dann diejenigen, die in einem Filter abziehen in der internen API:

var request = actionContext.Request; 
if (!request.RequestUri.PathAndQuery.StartsWith("/api")) 
{ 
    return Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)); 
} 

string cookieToken = ""; 
string formToken = ""; 

IEnumerable<string> tokenHeaders; 
if (request.Headers.TryGetValues("RequestVerificationToken", out tokenHeaders)) 
{ 
    string[] tokens = tokenHeaders.First().Split(':'); 
    if (tokens.Length == 2) 
    { 
     cookieToken = tokens[0].Trim(); 
     formToken = tokens[1].Trim(); 
    } 
} 

try 
{ 
    AntiForgery.Validate(cookieToken, formToken); 
} 
catch (HttpAntiForgeryException ex) 
{ 
    return Task.FromResult(new HttpResponseMessage(HttpStatusCode.Unauthorized)); 
} 

return Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)); 

Das funktioniert, irgendwie. Der Fehler, den ich bekomme ist:

Das mitgelieferte Anti-Fälschungs-Token war für Benutzer "" gedacht, aber der aktuelle Benutzer ist "WINDOWS8VM \ Michael".

Irgendwie muss ich die Windows-Benutzer verkörpern, wenn die Token zu erzeugen, so dass der Benutzer die gleichen sind. Ein weiteres Problem besteht darin, dass die CredentialCache.DefaultNetworkCredentials leer sind. Dies ist fast sicher, da die Windows-Authentifizierung für die öffentliche API nicht aktiviert ist. Der Anwendungspool hat jedoch eine Identität und es wäre diese Identität, nach der ich suchen würde.

+1

Wenn Sie eine API (intern) von einer anderen API (öffentlich) anrufen, warum sollten Sie überhaupt Anti-Fälschungs-Tokens wollen? – Evk

+0

Der Hauptgrund besteht darin, sicherzustellen, dass andere interne Anwendungen diese API nicht nutzen können. Die Daten sind außergewöhnlich empfindlich. Wenn wir nur Windows-Authentifizierung haben, fühlen wir uns nicht genug.Es kann etwas sein, mit dem wir uns begnügen müssen, aber wir würden gerne einen Träger hinzufügen und wir wollten damit beginnen, 'AntiForgenerschein'-Token zu verwenden. Es gibt natürlich andere Wege, aber sie sind mehr involviert, was die Architektur betrifft. –

+1

Sind Sie sicher, dass Sie wirklich verstehen, was Sie hier mit AF-Tokens erreichen möchten? Diese Token sollen CSRF-Angriffe verhindern und nicht die Anfragen zwischen den Diensten schützen. Die Art und Weise, wie Sie sie verwenden möchten, ist völlig gegen das, wofür sie bestimmt sind. Sie übergeben im Wesentlichen eine Menge verschlüsselter Daten von Dienst A an Dienst B und prüfen, ob B den Entschlüsselungsschlüssel kennt, aber dann wird kein AF benötigt, um solche Dinge zu tun. – Evk

Antwort

2

Da Sie nur überprüfen möchten, dass Ihre interne API von einem vertrauenswürdigen Aufrufer aufgerufen wird (dh öffentliche API), müssen Sie keine Fälschungs-Tokens verwenden. Stattdessen können Sie den gleichen Mechanismus verwenden, den AF-Token verwenden, um Ihre eigenen Daten in der öffentlichen API zu verschlüsseln, dann entschlüsseln und verifizieren Sie diese Daten, was Sie von der internen API erwarten. Dafür können Sie die Methoden MachineKey.Protect und MachineKey.Unprotect verwenden.

Wenn Sie dies tun, beachten Sie, dass Schlüssel, die für die Verschlüsselung je Anwendung verwendet werden könnten. Sehen Sie sich die Beschreibung des Elements machineKey an und notieren Sie sich den Effekt der Einstellung IsolateApps. Wenn Ihr Computerschlüssel mit IsolateApps konfiguriert ist, kann eine IIS-Anwendung Daten, die durch einen anderen geschützt sind (dieselbe Geschichte mit AF-Token), auch dann nicht entschlüsseln, wenn sie sich beide auf demselben Computer befinden.

Beachten Sie auch, dass, wenn Apps in dieser Hinsicht nicht isoliert sind, jede IIS-Anwendung auf demselben Computer in der Lage sein wird, Daten mit demselben Schlüssel zu verschlüsseln und Ihre interne API aufzurufen. Aber wenn Sie nur Ihre API von einem anderen Rechner in Ihrem Netzwerk schützen wollen - sollte das gut genug sein.

Wenn Sie nicht sicher sind, welche Daten zu verschlüsseln sind - kombinieren Sie alle vertraulichen Daten aus der Anfrage selbst, hacken Sie sie und schützen Sie diesen Hash. Dann bei internen API kombinieren Sie die gleichen Daten, Hash-es, Unprotect Daten vom Anrufer erhalten und sicherzustellen, dass ungeschützte Daten Ziel Hash übereinstimmt.

+0

Diese beiden Web-Anwendungen werden auf verschiedenen Rechnern installiert. Wenn die Maschinenschlüssel gleich wären, wären sie in der Lage, erfolgreich zu verschlüsseln und zu entschlüsseln, richtig? –

+0

Ja, als Option können Sie diese Schlüssel auf beiden Rechnern genau auf die gleichen Werte setzen (siehe Rechner-Link in Antwort). – Evk

+0

Okay, ich denke, das wird ziemlich gut funktionieren, weil nur diese beiden Maschinen synchron wären. Das ist effektiv genau das, was wir wollen! –