2008-11-07 2 views
6

Wir haben eine .NET Web Service API. Derzeit wird die API von der SOAP-Definition verwendet, da wir die Authentifizierung über ein benutzerdefiniertes Authentifizierungselement im SOAP-Header benötigen. Funktioniert perfekt. fein.Was ist der beste Weg, um für einen Web-Service zu authentifizieren

SOAP erfordert, dass die Anforderung ein POST ist. Wir wollen den Benutzern erlauben, das GET-Verb zu verwenden (damit es cachefähig sein kann).

Also, was ist der beste Weg, um eine einfache GET API (muss nicht ein Webservice sein!), Die auch Authentifizierung bietet?

Beispiel API Route:

http://www.blah.com/api/Search?query=Foo

Ist dies eine akzeptable und gängige Praxis?

http://www.blah.com/api/Search?query=Foo&Key=<some guid>

HINWEIS: Ich weiß nicht auch SSL implementieren will noch zusätzliche Software oder Plug-in in IIS, etc. etc.

Antwort

1

installieren Wenn der Web-Service gesichert werden muss, und ich gehe davon aus, dass dies der Fall ist, da Sie derzeit einen Authentication-Header haben, dann sollten Sie zumindest bei der Authentifizierung mit GET und nicht mit SSL nachdenken. Zumindest würde ich die Autorisierungsanfrage per SSL an den Webservice/die Anwendung senden. Wenn Sie keine Authentifizierung bei jeder Anforderung bereitstellen möchten, müssen Sie einen Berechtigungscookie akzeptieren (und im Service generieren), den der Benutzer für nachfolgende Anforderungen verwenden kann.

Ich würde vermeiden, Authentifizierung in der URL für genau den Grund, dass Sie GET unterstützen möchten - wenn die URL zwischengespeichert werden kann, dann werden die Anmeldeinformationen auch im Cache gespeichert. Dies bricht die Sicherheit des Webdienstes, da jeder die zwischengespeicherten Anmeldeinformationen wiederverwenden kann.

+0

*) Das Caching sollte nur auf der Client-Seite erfolgen. Die Anmeldedaten sollten also identisch sein. ??? *) Kann ich bitte mehr über den Autorisierungs-Cookie sprechen? –

0

Mit einer GET nur API, ich hätte eine erste Methode, die eine eindeutige Sitzungs-ID abruft.

Eg: GET/api action = Auth & username = user & password = hashedpassword wäre ein 16 Zeichen Token zurückgeben, die Sie auf Ihrer Seite speichern und Sie benötigen diese einmalige Token für jeden nachfolgenden Aufruf.

Wenn die API in PHP erstellt wurde, könnten Sie ihre Session-Handling-Funktionalität von PHP verwenden, um dies zu erreichen (es hat Timeout/Garbage Collection). Es gibt ähnliche Funktionen in ASP.NET.

Es ist anfällig für Angriffe wiederholen (jemand ergreift oder erraten die Sitzungs-ID), aber wenn Sie etwas einfaches wollen, das ist der Weg zu gehen. Jede Nicht-HTTPS-Website wäre auf die gleiche Weise anfällig. Sie können die Sitzungs-ID für zusätzliche Sicherheit mit der IP-Adresse des Benutzers verknüpfen.

0

Wenn Sie WCF verwenden, können Sie auf den integrierten Sicherheitsmechanismen aufbauen. Wenn Sie keine Standard-Frameworks für die Sicherheit verwenden möchten, werden Sie höchstwahrscheinlich Sicherheit durch Unklarheit leisten.

+0

Ich habe versucht WCF auf einen Prototyp für einen einfachen Web-Service. Ich bin eine Code-orientierte Art von Entwickler, und all diese XML-Konfiguration macht mich aus. Außerdem habe ich nie herausgefunden, wie man benutzerdefinierte Autorisierung hinzufügt. –

1

Wenn sich Ihre Clients in derselben Domäne befinden, können Sie die integrierte Windows-Authentifizierung in Ihrer IIS-Anwendung aktivieren. Ihre Anwendung akzeptiert jetzt nur authentifizierte Windows-Benutzer. Fügen Sie Ihren eigenen RoleProvider für eine feinere, rollenbasierte Granularität hinzu.

0

Ähnlich wie Thomas Eydes Antwort: Sie können ein Single-Sign-On-System wie Siteminder verwenden, um die URL zu sichern. Der Aufrufer fordert, dass ein Token enthalten sein muss, das normalerweise in einem Cookie gespeichert wird, aber zur Abfragezeichenfolge hinzugefügt werden kann.

Jede SSO- oder Web-Service-Management-Plattform erschwert absichtlich die Authentifizierung, wenn SSL nicht verwendet wird.

Verwandte Themen