Wie zu sichern eine ASP.NET Web-API
Ich bauen will ein Erholsamen web-service mit ASP.NET Web-API, mit der Drittanbieter-Entwickler Zugriff auf meine Anwendung Daten.
Gelesen habe ich sehr viel über OAuth und es scheint die Norm sein, sondern eine gute Probe mit Dokumentation welche erklären, wie es funktioniert (und das tatsächlich funktioniert!) scheint unglaublich schwierig (vor allem für einen Neuling auf OAuth).
Gibt es ein Beispiel, das tatsächlich baut und arbeitet und zeigt, wie diese umzusetzen ist?
Habe ich heruntergeladen zahlreichen Proben:
- DotNetOAuth - Dokumentation ist hoffnungslos von einem Neuling Perspektive
- Thinktecture - kann nicht ankommen es zu bauen
Habe ich auch angeschaut blogs suggeriert einen einfachen token-basierten System (wie diese) - das scheint neu zu erfinden das Rad, aber es hat auch den Vorteil, dass konzeptionell ziemlich einfach.
Es scheint, es gibt viele Fragen wie diese auf, DAMIT aber keine guten Antworten.
Was jeder tut in diesem Raum?
InformationsquelleAutor Craig Shearer | 2012-08-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Update:
Ich habe meine andere Antwort wie zu verwenden JWT-Authentifizierung für die Web-API in hier für alle interessierten in der JWT:
JWT-Authentifizierung für Asp.Net Web-Api
Wir es geschafft haben, gelten HMAC-Authentifizierung auf sicheren Web-API, und es war okay. HMAC-Authentifizierung verwendet geheimen Schlüssel für jeden Verbraucher, der Verbraucher-und server beide wissen, hmac-hash einer Nachricht, HMAC256 verwendet werden soll. Die meisten der Fälle, gehashte Passwort der Verbraucher verwendet einen geheimen Schlüssel.
Die Nachricht normal ist gebaut von Daten in der HTTP-Anforderung, oder sogar kundenspezifische Daten, die Hinzugefügt wird, um HTTP-header der Nachricht enthalten sein:
Unter der Haube, HMAC-Authentifizierung:
Verbraucher sendet einen HTTP-request zum web-server, nach der Erstellung der Signatur (Ausgabe von hmac hash), die Vorlage der HTTP-Requests:
Beispiel für eine GET Anfrage:
Den Nachricht-hash zu erhalten, Signatur:
Beispiel für POST-request mit query-string (Signatur unten ist nicht korrekt, nur ein Beispiel)
Den Nachricht-hash zu erhalten, Signatur
Bitte beachten Sie, dass die Formular-Daten und query-string sollte in Ordnung sein, damit der code auf dem server get-query-string und form-Daten zur Erstellung der richtigen Nachricht.
Wenn die HTTP-Anforderung an den server, eine Authentifizierungs-action-filter ist implementiert, um eine Analyse der Anfrage, Informationen zu erhalten: HTTP-verb, timestamp -, uri -, form-Daten und query-string, der dann auf dieser Grundlage zu bauen, Unterschrift (verwenden Sie hmac-hash) mit dem geheimen Schlüssel (Hash-Passwort) auf dem server.
Geheime Schlüssel habe aus der Datenbank mit dem Benutzernamen auf Anfrage.
Dann auf server-code vergleicht die Unterschrift auf dem Antrag mit der Unterschrift gebaut; wenn gleich, ist die Authentifizierung übergeben, andernfalls fehlgeschlagen.
Den code zu bauen-Signatur:
So, wie verhindern von replay-Angriff?
Add constraint für den Zeitstempel, so etwas wie:
(servertime: Zeitpunkt der Anfrage kommen zu server)
Und cache die Signatur der Anfrage im Speicher (verwenden Sie MemoryCache, sollte Sie in der limit-Zeit). Wenn die nächste Anfrage kommt mit der gleichen Signatur mit der vorherigen Anfrage, es wird abgelehnt werden.
Den demo-code ist gesetzt als hier:
https://github.com/cuongle/Hmac.WebApi
nur der timestamp scheint nicht ausreichend viel, während die wenig Zeit haben, können Sie simulieren die Anfrage und zum server gesendet, ich habe gerade editiert meinen post, verwenden Sie beide das beste wäre.
Sind Sie sicher, dass diese funktioniert, wie es sollte? Sie sind hashing der Zeitstempel der Nachricht und Zwischenspeichern der Nachricht ist. Dies würde bedeuten, eine andere Unterschrift, jede Anfrage zu machen, müsste Ihrer Cache-Signatur nutzlos.
scheint, dass ich nicht Ihr Punkt, der Grund für die Verwendung von Cache hier ist, um zu verhindern, dass relay-Angriffs ist, nichts mehr
Sie können finden Sie [diese Seite] (jokecamp.wordpress.com/2012/10/21/...). Ich werde aktualisieren diese Quelle bald
InformationsquelleAutor cuongle
Ich würde vorschlagen, beginnend mit der einfachsten Lösungen erst - vielleicht auch einfach die HTTP-Basic-Authentifizierung + HTTPS ist genug in Ihrem Szenario.
Falls nicht (zum Beispiel können Sie nicht verwenden, https, oder benötigen weitere komplexe Schlüssel-management), können Sie einen Blick auf HMAC-basierten Lösungen vorgeschlagen, die von anderen. Ein gutes Beispiel einer solchen API wäre Amazon S3 (http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html)
Schrieb ich einen blog-post über HMAC-basierte Authentifizierung in ASP.NET Web-API. Es beschreibt sowohl die Web-API-service und Web-API-client und der code ist verfügbar auf bitbucket. http://www.piotrwalat.net/hmac-authentication-in-asp-net-web-api/
Hier ist ein Beitrag über die Basic-Authentifizierung in der Web-API: http://www.piotrwalat.net/basic-http-authentication-in-asp-net-web-api-using-message-handlers/
Denken Sie daran, dass, wenn Sie gehen, um eine API zu 3. Parteien, höchstwahrscheinlich werdet Ihr auch verantwortlich für die Bereitstellung von client-Bibliotheken. Die Standardauthentifizierung hat einen deutlichen Vorteil hier, wie es ist unterstützt auf den meisten Plattformen out of the box. HMAC, auf der anderen Seite, ist nicht standardisiert und erfordert eine benutzerdefinierte Implementierung. Diese sollte relativ einfach sein, aber immer noch Arbeit erfordern.
PS. Es gibt auch eine option zum verwenden von HTTPS - + - Zertifikate. http://www.piotrwalat.net/client-certificate-authentication-in-asp-net-web-api-and-windows-store-apps/
InformationsquelleAutor Piotr Walat
Haben Sie versucht, DevDefined.OAuth?
Habe ich es benutzt zum sichern meiner WebApi mit 2-Legged OAuth. Ich habe auch erfolgreich getestet mit PHP-clients.
Ist es relativ einfach, um Unterstützung für OAuth verwenden diese Bibliothek. Hier ist, wie Sie implementieren können, der Anbieter für ASP.NET MVC-Web-API:
1) Holen Sie sich den source-code von DevDefined.OAuth: https://github.com/bittercoder/DevDefined.OAuth - die neueste version ermöglicht
OAuthContextBuilder
Erweiterbarkeit.2) Aufbau der Bibliothek und verweisen Sie in Ihrem Web-API-Projekt.
3) Erstellen Sie eine benutzerdefinierte Kontext-generator zur Unterstützung der Erstellung einer Kontext von
HttpRequestMessage
:4) Verwenden Sie dieses tutorial, zum erstellen eines OAuth-Anbieter: http://code.google.com/p/devdefined-tools/wiki/OAuthProvider. Im letzten Schritt (Zugriff auf die Geschützte Ressource. B.) Sie können diesen code in Ihre
AuthorizationFilterAttribute
Attribut:Implementierte ich meinen eigenen provider, also habe ich noch nicht getestet der obige code (außer natürlich die
WebApiOAuthContextBuilder
die ich verwende in meinem provider) aber es sollte funktionieren.Hallo, Sie sagen, Sie haben gerollt, Ihr eigenes.. nur noch ein paar Fragen, wenn Sie don ' T Geist teilen. Ich bin in einer ähnlichen position, wo ich habe eine relativ kleine MVC-Web-API. Die API Controller sitzen neben anderen controller/Aktionen die unter forms-auth. Implementierung von OAuth scheint übertrieben, wenn ich bereits eine Mitgliedschaft Anbieter die ich verwenden könnte, und ich brauche nur zu sichern eine Handvoll von Operationen. Ich möchte wirklich ein auth-Aktion, gibt einen verschlüsselten token - dann verwendet die token, die in nachfolgenden aufrufen? jede info willkommen, bevor ich zu Begehen, um die Umsetzung einer vorhandenen auth-Lösung. danke!
Majer - eine chance, die Sie teilen können, wie Sie implementiert haben die Anbieter im detail? Ich habe einige Probleme beim senden von Antworten an den client zurück.
InformationsquelleAutor Maksymilian Majer
Web-API eingeführt, die ein Attribut
[Authorize]
für Sicherheit zu sorgen. Dies kann Global festgelegt werden (Globale.asx)Oder pro controller:
Natürlich Ihre Art der Authentifizierung kann sich ändern, und Sie möchten möglicherweise führen Sie Ihre eigene Authentifizierung, wenn dies geschieht, können Sie feststellen, nützlich Erben von Authorizate Attribut und erweitern es um Ihre Anforderungen zu erfüllen:
Und in Ihrem controller:
Hier ist ein link auf eine andere benutzerdefinierte Implementierung für WebApi Berechtigungen:
http://www.piotrwalat.net/basic-http-authentication-in-asp-net-web-api-using-membership-provider/
Es arbeitet fantastisch. Einfach schön zum lernen und anfangen zu arbeiten auf unserer eigenen access-Token.
Eine kleine Kommentar - seien Sie vorsichtig mit
AuthorizeAttribute
, da es zwei verschiedene Klassen mit gleichen Namen in unterschiedlichen namespaces: 1. System.Web.Mvc.AuthorizeAttribute -> für MVC-Controller 2. System.Web.Http.AuthorizeAttribute - > für WebApi.InformationsquelleAutor Dalorzo
Wenn Sie wollen, sichern Sie sich Ihren API in einer server-zu-server-Mode (keine Umleitung auf die website, für die 2-beinigen-Authentifizierung). Sie können sich bei OAuth2-Client Credentials Grant-Protokoll.
https://dev.twitter.com/docs/auth/application-only-auth
Entwickelt ich eine Bibliothek, die helfen können Sie problemlos hinzufügen diese Art von Unterstützung, um Ihre WebAPI. Sie können es als NuGet-Paket:
https://nuget.org/packages/OAuth2ClientCredentialsGrant/1.0.0.0
Die Bibliothek Ziele .NET Framework 4.5.
Sobald Sie das Paket hinzufügen zu Ihrem Projekt, wird es eine readme-Datei im Stammverzeichnis Ihres Projekts. Anschauen kann man sich das readme-Datei finden Sie unter konfigurieren/verwenden Sie dieses Paket.
Prost!
InformationsquelleAutor Varun Chatterji
in der Fortsetzung zu @ Cuong Le s Antwort , mein Ansatz zu verhindern replay-Angriff wäre
//Verschlüsseln Sie die Unix-Zeit auf der Client Seite unter Verwendung des gemeinsamen privaten Schlüssel(oder Benutzer-Passwort)
//Senden Sie es als Teil der request-header server(WEB-API)
//Entschlüsseln der Unix-Zeit am Server(WEB-API) unter Verwendung des gemeinsamen privaten Schlüssel(oder Benutzer-Passwort)
//Überprüfen Sie die Zeitdifferenz zwischen dem Client die Unix-Zeit und Server an Unix-Zeit, sollte nicht größer sein als x Sek.
//wenn Benutzer-ID/Hash-Kennwort korrekt sind, und die entschlüsselte UnixTime ist innerhalb x-Sekunden Zeit-server, dann ist es eine gültige Anfrage
InformationsquelleAutor refactor