2009-08-25 8 views
5

Ich habe einen WCF-Webdienst, die von einer C# Client-Anwendung verbraucht wird, und ich habe auch 4 in Active Directory gespeichert Gruppen. Die Clientanwendung sollte diesen Webdienst durch die Übermittlung von Anmeldeinformationen verbinden.WCF-Web-Service-Authentifizierung auf Basis von AD-Gruppen

Voraussetzung:

  1. Web-Service-Funktionalität einschränken basierend auf Windows-Gruppe in AD (Active Directory) gespeichert Benutzerberechtigungsnachweis
  2. Pässe spezifische Benutzerdaten von der Client-Anwendung auf diesen Web-Service

Frage:

Wie zu authentifizieren oder angemeldete Benutzer validieren zu diesem Web-Service auf Verbinden, welches Ereignis Griff Die r-Funktion wird aufgerufen, um angemeldete Benutzeranmeldeinformationen zu überprüfen.

Wenn jemand davon weiß dann bitte mich wissen lassen

Antwort

10

Sie müssen zwei Konzepte auseinander halten:

  • AUTHENTICATION ist der Prozess der Bestimmung, wer es Sie, dass ruft, und Sicherstellen, dass er wirklich derjenige ist, für den er sich ausgibt; dies getan werden kann Benutzername/Passwort, Windows-Anmeldeinformationen (er hatte bereits authentifiziert sich mit seinem Windows-Rechner durch Protokollierung auf) oder durch den Anrufer erfordern einige Informationen (Zertifikat)

  • ZULASSUNG haben, ist der Prozess - wenn Sie wissen, , wer Sie anruft, um zu bestimmen, was das Anrufer tun können (oder das, was er nicht tun kann)

um Active Directory-Gruppen zu verwenden, müssen Sie einen Sicherheitsmodus in WCF verwenden, die Stützen Windows-Anmeldeinformationen Am einfachsten ist es Windows-Anmeldeinformationen von Anfang an zu verwenden, das der Standard für wsHttpBinding und netTcpBinding ist - in diesem Fall wird der Anrufer immer mit jedem Anruf auf seine Windows-Anmeldeinformationen übergeben, und Sie können durch einen Blick auf den diejenigen auf der Serverseite inspizieren ServiceSecurityContext.Current.WindowsIdentity:

WindowsIdentity caller = ServiceSecurityContext.Current.WindowsIdentity; 

Das funktioniert gut in einem Intranet-Szenario - jeder ist hinter einem Unternehmens-Firewall und trotzdem auf ihren Maschinen authentifizierte. Um dies zu ermöglichen, verwenden Sie einfach die Bindung wsHttp oder netTcp (ich würde netTcp in diesem Fall empfehlen).

Die andere etwas komplizierteren Fall ist, wenn Sie Ihren Kunden ein X.509-Zertifikat präsentieren, und Sie dann, dass in Ihrem Netzwerk zu einem vorhandenen Active Directory-Benutzer auf der Server-Seite abzubilden. Das ist jedoch ziemlich fortgeschritten.

Sobald Ihr Anrufer authentifiziert ist, z Wenn Sie wissen, wer anruft, können Sie das reguläre rollenbasierte Sicherheitsmodell zum Einschränken von Berechtigungen verwenden. Fügen Sie einfach [PrincipalPermission(....)] Attribute zu Ihren Methoden hinzu, die Sie schützen möchten. Wenn der Benutzer diesen Anforderungen nicht entspricht, wird eine Sicherheitsausnahme ausgelöst und die Methode wird nicht ausgeführt.

[PrincipalPermission(SecurityAction.Demand, Role = "Administrators")] 
    [PrincipalPermission(SecurityAction.Demand, Name = "JohnDoe")] 
    public string SayHello(string caller) 
    { 
    ...... 
    } 

Sie können mehrere dieser „Principal“ Attribute, und sie sind zusammen in einer „ODER“ -fashion abgestimmt - wenn einer von ihnen den aktuellen Anrufer übereinstimmt, wird er das machen dürfen Anruf.

Weitere Informationen zur Verwendung rollenbasierter Sicherheit finden Sie auf Seite 4 dieses Artikels Fundamentals of WCF Security.

Marc

+0

Dank arc, lassen Sie mich Ihre vorgeschlagene Lösung versuchen. Vielen Dank nochmal. –

+0

Das ist großartig, danke. Hat mir viel Arbeit gebracht. Wie fangen Sie jedoch die SecurityException, die ausgelöst wird? Es scheint vor dem Aufruf der Methode ausgelöst zu werden, wird aber nicht auf den Callstack übertragen ... – trendl

+0

Es wird dem Client übergeben - der Client muss sich damit befassen. –

Verwandte Themen