Sichern der ASP.NET MVC-Controller-Aktion, die JSON zurückgibt

8

Ich habe eine MVC3-Anwendung und meine Controller-Aktionen werden mit dem [Authorize] -Attribut gesichert. So weit, so gut, Formulare Auth funktioniert großartig. Jetzt möchte ich meiner Anwendung eine JSON-API hinzufügen, damit einige Aktionen auch für Nicht-Browser-Clients zur Verfügung stehen.

Ich habe Probleme, das richtige Design herauszufinden.

1) Jeder Benutzer hat einen geheimen API-Schlüssel.

2) Benutzer-ID 5 ruft Ссылка auf. Hier ist secure_hash einfach der SHA1-Hash von Parametern von param1 und param2, die mit dem geheimen API-Schlüssel für den Benutzer verknüpft sind

2) / foocontroller / bacaction wird mit [CustomAuthorize] versehen. Dies wird eine Implementierung von AuthorizeAttribute sein, die prüft, ob die Anfrage als JSON eingeht. Wenn dies der Fall ist, wird der Hash überprüft und überprüft, ob er übereinstimmt. Andernfalls, wenn die Anfrage HTML ist, rufe ich in bestehende Autorisierung auf.

Ich bin mir überhaupt nicht sicher, ob das funktionieren wird. Ist es normal, einen sicheren Hash in der Abfragezeichenfolge zu übergeben oder sollte ich ihn als HTTP-Header übergeben? Ist es besser, HTTP Basic Auth anstelle eines Hash zu verwenden, der mit dem geheimen API-Schlüssel erstellt wurde?

Tipps von jedem, der eine Web-API mit ASP.NET MVC erstellt hat, wären willkommen!

    
Bilal and Olga 01.05.2011, 22:30
quelle

1 Antwort

11

Ich übergebe den geheimen API-Schlüssel zusammen mit dem Benutzernamen und dem Passwort im Anfragetext. Nach der Autorisierung wird ein Token generiert, und der Client muss diesen im Autorisierungsheader übergeben. Dies wird bei jeder Anfrage im Basis-Controller überprüft.

  1. Der Client ruft myapp.com/authorize auf, die das Authentifizierungs-Token zurückgibt.
  2. Der Client speichert das Authentifizierungstoken lokal.
  3. Der Client ruft myapp.com/anycontroller mit authtoken im Authorization-Header auf.

AuthorizeController erbt vom Controller. Anycontroller erbt von einem benutzerdefinierten Basiscontroller, der den Autorisierungscode ausführt.

Mein Beispiel erfordert die folgende Route, die POST-Anforderungen an einen ActionResult-benannten Post in einem beliebigen Controller richtet. Ich tippe dieses in Hand ein, um es so weit wie möglich zu vereinfachen, um Ihnen die allgemeine Idee zu geben. Erwarten Sie nicht, schneiden und einfügen und es funktioniert:)

%Vor%

Ihr Auth-Controller kann dies verwenden

%Vor%

Ihre anderen Controller erben von einem Basiscontroller

%Vor%

Beispielcode zum Aufrufen der API

%Vor%     
Jason Watts 01.05.2011, 22:51
quelle