2008-11-13 4 views
7

Ich verwende einen WCF-Dienst und einen net.tcp-Endpunkt mit dem von ServiceAuthentication verwendeten PermissionMode, der auf UseWindowsGroups festgelegt ist.Verwenden der Windows-Rollenauthentifizierung in der App.config mit WCF

Derzeit verwende ich in der Implementierung des Dienstes das PrincipalPermission-Attribut, um die Rollenanforderungen für jede Methode festzulegen.

 [PrincipalPermission(SecurityAction.Demand, Role = "Administrators")] 
     [OperationBehavior(Impersonation = ImpersonationOption.Required)] 
     public string method1() 

Ich versuche, so ziemlich genau die gleiche Sache zu tun, außer die Konfiguration für die in der app.config gesetzt Rolle. Gibt es eine Möglichkeit, dies zu tun und weiterhin Windows-Gruppenauthentifizierung zu verwenden?

Danke

Antwort

3

Wenn ich gut verstanden habe, möchten Sie die Rolle zur Laufzeit auswählen. Dies kann mit einer permission Anforderung innerhalb der WCF-Operation erfolgen. Z.B.

public string method1() 
{ 
    PrincipalPermission p = new PrincipalPermission(null, "Administrators"); 
    p.Demand(); 
    ... 
8

Wenn Sie Ihren WCF-Dienst in IIS hosten, wird es in dem ASP.NET-Arbeitsprozess ausgeführt werden, was bedeutet, dass Sie die Authentifizierung und Autorisierung konfigurieren können, wie Sie mit ASMX Web Service tun würden:

<system.Web> 
    <authentication mode="Windows"/> 
    <authorization> 
     <allow roles=".\Administrators"/> 
     <deny users="*"/> 
    </authorization> 
</system.Web> 

Dann müssen Sie den anonymen Zugriff auf Ihren Endpunkt in IIS deaktivieren und stattdessen Windows Integrated Authentication aktivieren.
In der IIS-Management-Konsole machen Sie das, indem Sie den Dialog 'Eigenschaften' für Ihr virtuelles Verzeichnis aufrufen. Sie finden dann die Sicherheitseinstellungen in der Registerkarte 'Verzeichnissicherheit'.

Natürlich ist der einzige verfügbare Kommunikationskanal HTTP. Kunden müssen ihre Windows-Identität in der Anfrage an der Transportebene mit diesen Einstellungen bieten:

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="WindowsSecurity"> 
       <security mode="Transport"> 
        <transport clientCredentialType="Windows" /> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="https://localhost/myservice" 
        binding="wsHttpBinding" 
        bindingConfiguration="WindowsSecurity" 
        contract="IMyService" /> 
    </client> 
</system.serviceModel> 

Beachten Sie, dass, wenn Ihr Service-Endpunkt wsHttpBinding verwendet dann werden Sie auch SSL zu Ihrem Endpunkt hinzufügen müssen Dies ist eine Anforderung, die von WCF bei Verwendung der Sicherheit auf Transportebene erzwungen wird.
Wenn Sie stattdessen gehen für den Basichttpbinding, Sie sind dann in der Lage einen weniger sicher Authentifizierungsmodus in WCF TransportCredentialOnly genannt verwenden, wo SSL ist nicht mehr erforderlich.

Für detailliertere Informationen bietet here einen guten Überblick über die Sicherheitsinfrastruktur in WCF.

+3

Bitte beachten Sie, dass Sie den ASP.NET-Kompatibilitätsmodus in Ihrer Datei web.config aktivieren müssen, wenn Sie dies tun möchten. Ansonsten wird es einfach nicht funktionieren (und auch keinen Fehler werfen). – Rocklan

+0

Hinweis: Damit dies funktioniert, muss system.web/roleManager/@enabled auf "false" gesetzt sein, andernfalls werden die Rollen IIS .Net-Rollen und keine Windows-Gruppen sein. – Polyfun

Verwandte Themen