it-swarm.com.de

Speicherort für Zugriffs- und Aktualisierungstoken in der ASP.NET-Client-Webanwendung - Aufruf einer REST API)

Ich habe in ASP.NET eine Web-API erstellt, die als Einstiegspunkt in eine SQL Server-Datenbank für Berichtsdaten fungiert. Dieser Dienst verfügt über einen "Token" -Endpunkt, der einen Benutzer über ASP Identity) authentifiziert und einen 20-minütigen Zugriff und ein 2-wöchiges Aktualisierungstoken zurückgibt.

Diese API sollte nur über unsere eigenen Apps und Produkte zugänglich sein. Wir werden eine Android App, iOS App und ASP.NET Webanwendung schreiben, die sich bei dieser oben beschriebenen Web-API authentifiziert und Daten von dieser abruft. Ich bin für den ASP verantwortlich. NET-Client-Webanwendung und die API. Wir erstellen diese Apps alle intern, damit sich unsere Kunden anmelden und verwenden können. Keine Drittanbieter außerhalb meines Unternehmens rufen unsere API über eine ihrer eigenen Apps auf.

Für meine Client-ASP.NET-Webanwendung schreibe ich sie in ASP.NET MVC und sie verfügt derzeit nicht über eine Datenbank, da sie für alles mit der API kommuniziert.

Ich habe damit als Basis begonnen und es funktioniert ... aber jetzt muss ich diese HTML-Datei in eine ASP.NET-Webanwendung in MVC konvertieren und herausfinden, wo und wie das Zugriffstoken gespeichert und Token aktualisiert werden. http://blog.rfaisal.com/2014/01/14/building-your-own-api-and-securing-it-with-oauth-2-0-in-asp-net-webapi- 2 /

Meine Fragen sind:

  1. Ich verstehe, dass ich das Zugriffstoken bei nachfolgenden Aufrufen an die API übergeben muss, um CRUD-Operationen auszuführen. Wo soll ich meine Webanforderung stellen, um den Benutzer in der Webanwendung beim Anmelden zu authentifizieren ... über den dahinter liegenden C # -Code oder JavaScript wie im oben genannten Lernprogramm? Ich frage, weil mir klar ist, dass ich das Zugriffstoken in meinen JS Ajax-Aufrufen benötige, aber ich habe gehört, dass das Aktualisierungstoken muss "sicherer" sein und das Aufrufen vom Servercode bietet mir möglicherweise sicherere Optionen dafür?

  2. Wo speichere ich das Zugriffstoken? In einem in JavaScript oder auf dem Server erstellten Cookie? Im lokalen JavaScript-Speicher? In einer Sitzungsvariablen, die ich vielleicht an das JavaScript übergeben kann?

  3. Wo speichere ich das Aktualisierungstoken? Ich benötige dies, um das Zugriffstoken zu erneuern, bevor es abläuft. Ich habe dies zu Tode gegoogelt, kann aber online keine gute ASP.NET-Lösung finden, die mir sagt, wo oder wie ich dies aus der Sicht meiner konsumierenden Webanwendung speichern soll. Ein vom Server erstelltes Cookie, das in einer von der Webanwendung verwendeten SQL-Datenbank in einer Sitzungsvariablen gespeichert ist?

Ich brauche dringend Hilfe, und das macht mich wahnsinnig und hält mich nachts wach. Ich hoffe, jemand kann ein vollständiges, einfaches Beispiel liefern und vollständig beschreiben, was ich tun muss.

19
Andy DesRosiers

1. Wo soll der Benutzer authentifiziert werden?

Wenn es sich um einen Benutzer handelt, der sich authentifizieren muss, benötigen Sie etwas in Ihrem Front-End. Von Ihrem Front-End aus können Sie einfach ein POST an Ihr Back-End mit den Benutzeranmeldeinformationen senden. Sie überprüfen die Benutzeranmeldeinformationen und geben ein Zugriffs-/Auffrischungspaar aus, falls die Anmeldeinformationen vorhanden sind Sie müssen IMMER über das Back-End gehen, um einen Benutzer zu authentifizieren. Sie erwähnen, dass das Tutorial dies in JS tut, aber nicht. Es POSTS auf ein Anmeldeformular. Das POST = wird in JS initiiert, geht aber zum Backend.

2. Wo lagere ich den Zugang?

Der Zugriff kann genauso gespeichert werden wie normale Authentifizierungscookies. Sie haben verschiedene Möglichkeiten (sicheres Nur-http-Cookie, lokaler Speicher, Sitzungsspeicher usw.). Im einfachsten Fall speichern Sie es einfach in einem Cookie, damit es zusammen mit jeder Anforderung gesendet wird. Für eine mobile App ist es jedoch wahrscheinlich einfacher, sie in LocalStorage zu speichern.

3. Wo speichere ich das Refreshtoken?

Dies hängt stark von Ihrer Anwendung ab. Ich stellte die gleiche Frage vor einiger Zeit für mobile Apps (lesen Sie auch die Kommentare). Sie sollten das Refresoken an einem sicheren Ort aufbewahren. Für die Apps, die Sie entwickeln werden, können Sie den Vorschlägen aus der Antwort folgen, auf die ich verlinkt habe:

  • Speichern Sie das Aktualisierungstoken in LocalStorage
  • Speichern Sie das verschlüsselte Aktualisierungstoken mithilfe einer von Android/IOS bereitgestellten API irgendwo im Dateisystem. Speichern Sie den Verschlüsselungsschlüssel in localstorage. (oder umgekehrt).

Für andere Arten von Apps gibt es andere Möglichkeiten. Das Speichern des Zugriffs- und des Aktualisierungstokens in LocalStorage kann sich aus Sicherheitsgründen falsch anfühlen, aber ein Angreifer hat wahrscheinlich mehr Glück, das Token während der Übertragung abzufangen, als Zugriff auf das lokale Speicher zu erhalten. Andere, manchmal exotischere Vorschläge werden gegeben hier (z. B. IOS sicherer Speicher).

Zusatzinformation

  • Ich persönlich mag diese Reihe von Blogposts sehr. Beachten Sie, dass sie möglicherweise etwas veraltet sind, aber eine Fülle von Informationen zu einem REST-OWIN-Setup enthalten.
  • Bitte vergessen Sie nicht, alle anderen Sicherheitskontrollen zu implementieren, die ich nicht erwähnt habe, da dies die Antwort trüben würde. HTTPS, Nur-HTTP-Cookies, sichere Cookies, XSS-Verhinderungen usw. sollten implementiert werden, da sonst Ihr Token viel schneller gestohlen wird als zum Lesen dieser Antwort.
13
Michael