Gibt es eine Möglichkeit, den Zugriff auf eine ASMX Web Service zu beschränken, i.n. die asmx Seite und ihre WSDL?

StackOverflow https://stackoverflow.com/questions/1400198

Frage

Ich habe eine C # .net webservice, dass ich Zugang beschränken müssen. Ich brauche schon meine Verbraucher einen Benutzernamen und ein Passwort zu verwenden, um den Dienst zu nennen. Aber gibt es eine Möglichkeit, den Zugriff auf die tatsächliche asmx Seite und der WSDL zu beschränken? Ich würde benötigen Zugriff auf den Webservice von Benutzername / Passwort und IP-Adresse zu beschränken. Wenn ein Benutzer nicht die richtigen Anmeldeinformationen hat, ich würde sie nicht will wissen, was webmethods in dem Webservice existiert.

Kann dies obwohl IIS getan werden? Ich weiß, dass ich IP-Adressen über IIS beschränken kann, aber ich kann auch Benutzernamen / Kennwörter verwenden?

Gibt es eine andere Möglichkeit, diese außerhalb von IIS zu tun, vielleicht C # .NET?

War es hilfreich?

Lösung

Nun, da es ASMX ist haben Sie den gesamten ASP.NET-Laufzeit-Stack zur Verfügung.

Schritt # 1 - die Verwaltung der Ressource durch .config

ein <location> Tag für die Ressourcen Bewerben Sie gesichert werden sollen. Unter der Annahme, es ist eine einzige ASMX-Datei können Sie die folgende in Ihrer web.config einfach tun:

<location path="MyWebService.asmx">
    <system.web>
        <!-- resource specific options will go here -->
    </system.web>
</location>

Schritt # 2 - Authentifizierung Benutzer

Sie müssen entscheiden, wie du gehst, um tatsächlich Benutzer zu authentifizieren. Es gibt mehrere Möglichkeiten, dies und mehrere Authentifizierungsstandards zu tun, Sie nutzen könnten. Sie müssen den Ansatz wählen, der für Sie die richtige Passform ist.

Wenn Sie sich in einem Intranet sind und Windows-Authentifizierung verwenden würde ich sehr, dass vorschlagen nutzen, weil es wirklich die einfachste Option Setup zu bekommen. Allerdings, wenn Ihre Dienstleistungen über das Internet zugegriffen werden, dann ist Windows-Authentifikation nicht wirklich eine Option, und Sie müssen von einem Web-Standard wählen. Die einfachste davon ist Basic Authentication , aber Sie sollten nur verwenden diese über SSL, da der Benutzername / Passwort nicht verschlüsselt ist (nur base64 codiert). Der nächste Schritt aus, dass Authentifizierung Digest, die SSL nicht erforderlich, da der Benutzername / Passwort sind Verwendung eines MD5-Hash gesendet. Für die ultimative können Sie mit SSL v3 , wo Sie für jeden Benutzer ein bestimmtes Client-Zertifikat auszustellen Ihrer API.

Nun, die Option, die Sie für die Sicherheit wählen diktiert, was sonst noch getan werden muss. Wenn Sie Windows-Sicherheit wählen, ist es so einfach wie das Hinzufügen das folgende Element zum <system.web> Element mit begannen wir in Schritt 1:

<authentication mode="Windows" />

Der Rest der Sicherheitsprotokolle wird ein wenig mehr Arbeit zu verlangen. ASP.NET bietet keine intrinsische Unterstützung für Basic, Digest oder SSL v3. Technisch können Sie IIS nutzen diese Art der Authentifizierung für Sie zu tun, aber es ist immer zu einem Windows-Benutzer gehen kartieren. Wenn das eine Option für Sie, dann lassen Sie das <authentication mode="Windows" /> Element und entsprechend konfigurieren IIS. Wenn Sie jedoch, dass keine Option ist, sei es, weil man einfach keine Kontrolle über IIS / ActiveDirectory- haben oder müssen Sie gegen eine individuelle Benutzerdatenbank authentifizieren, dann bedeutet das, dass Sie eine benutzerdefinierte anschließen müssen Httpmodule Unterstützung für diese Sicherheit bieten Protokolle.

Schritt # 3 - Sicherung der Ressource

Der einfachste Ansatz, um die Ressource zu sichern ist im Grunde sagen: „Lassen Sie sich nicht jeder, der in irgendeiner Weise in diese Ressource nicht erfolgreich authentifiziert hat“. Dies geschieht mit Hilfe der folgenden Berechtigungskonfiguration:

<authorization>
    <deny users="?" />
</authorization>

Wenn Sie nur wollte erlauben bestimmte Benutzer, die Sie könnte sich ändern, die folgende stattdessen zu tun:

<authorization>
    <deny users="*" />
    <allow users="jdoe, msmith" />
</authorization>

Ein weiterer Ansatz ist Rollen (Gruppen) zu definieren und einfach die Ressource sperren auf eine besondere Rolle, die Sie die Benutzer setzen, die die Ressource in zugreifen möchten.

<authorization>
    <deny users="*" />
    <allow roles="My Service Users" />
</authorization>

Diese Karten auch auf Windows-Authentifizierung, da kann man einfach Setup eine Gruppe von Windows und lassen Sie Ihre MIS-Team verwalten, die Benutzer in dieser Gruppe sind mit ActiveDirectory-. Aber auch die Funktion funktioniert gut für Nicht-Windows-Authentifizierung vorausgesetzt, die Sicherheitsimplementierung Sie entlarvt Rollen über seine IPrincipal Implementierung verwendet haben.

Andere Tipps

Zwei Optionen: Erstellen Sie eine ganz andere Seite auf einem anderen Port mit Berechtigungen gesperrt. Dies hat den Vorteil, einen gewisse Menge an „Sicherheit durch Unklarheit“ Providing (halb im Scherz ...) Oder Sie können eine neue Anwendung unter Ihrer Website (gleich Port, anderer Weg), auf einem anderen Anwendungspool hinzufügen und Berechtigungen diese Weise zuordnen.

In jedem Fall Ihren Web-Service wird in der Lage sein nicht mit den verschiedenen ASP.NET „Dinge“ wie das Anwendungsobjekt (na ja, es wird, aber es wird nicht das gleiche) zu sprechen. Die Bereitstellung ist nur etwas härter. Die gleichen Binärdateien bereitstellen, aber nur schließen die eine Web-Service-Datei

Sie können authentifizieren ein Httpmodule verwenden. SSL + BasicAuthentication sollte die beste Interop mit anderen Werkzeugketten ergeben.

In der Httpmodule, haben Sie Zugriff auf die Anforderung und können nicht authentifizierte Benutzer nur .asmx Anfragen Zugriff verweigern. Und selbst dann könnten Sie lassen sie die WSDL-Zugriff.

In <add path="*.asmx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" /> zum <httpHandlers> Abschnitt der web.config-Datei

Ich weiß nicht, wie praktisch ist dies für Sie, aber Sie sollten sich überlegen zu WCF aktualisieren. WCF ist vollständig rückwärtskompatibel mit ASMX Web Services und können Sie steuern, ob die WSDL durch die Definition einer MEX (Metadatenaustausch) Endpunkt ausgesetzt ist. Kein MEX-Endpunkt, keine WSDL.

Sie können stoppen WSDL durch Entfernen des Dokumentationsprotokoll aus dem Element in Machine.config gezeigt werden

Update: Web Services-Authentifizierung - Best Practices Wenn die Benutzer Benutzernamen haben / Passwörter können Sie HTTP-Basic-Authentifizierung über HTTPS verwenden.

Sie können sie auch in einem etwas unterschiedlich Art und Weise umzusetzen. Der erste Aufruf von Ihrem Web-Service sollte die Authentifizierungsmethode sein. Client authentifiziert und erhält einen Authentifizierungstoken. Dieses Token sollte von Ihrem Web-Service ausgesetzt zu allen anderen Methoden dargestellt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top