Frage

Meine Frage ist in Bezug auf die beste (auch bekannt als „am wenigsten schmerzhaft“) Art und Weise Zugang zu einem WCF-Dienst zu sichern, das nur für unsere firmeninternen Nutzer ausgesetzt ist. Das Ziel ist es, sicherzustellen, dass der Dienst nur über eine einzige Windows Forms-Anwendung, die jeder unseres Benutzers installiert hat zugegriffen wird. Wenn der Dienst aufgerufen wird, möchte ich den Service in der Lage sein, zu bestätigen, dass es von der zulässigen Anwendung aufgerufen wurde.

Der Dienst zu sichernde verwendet Basichttpbinding, das Streaming unterstützt, so dass ich glaube, ich beschränkt bin Level-Sicherheit zu transportieren.

Im Folgenden sind vereinfachte Versionen der <bindings> und <services> Abschnitte aus meinem Dienst der Konfigurationsdatei.

<bindings>
  <basicHttpBinding>
    <binding name="Service1Binding" transferMode="Streamed"/>    
  </basicHttpBinding>
</bindings>

<services>
    <service name="WCFServiceSecurity.Service1" 
        behaviorConfiguration="WCFServiceSecurity.Service1Behavior">
        <endpoint address=""
            binding="basicHttpBinding"
            contract="WCFServiceSecurity.IService1"
            bindingConfiguration="Service1Binding"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    </service>
</services>

Kann jemand bieten einige Details darüber, was Aktionen ich brauchen würde, zu ergreifen, um die Sicherheit auf diesen Dienst zu implementieren?

Hinweis: Ich bin neu in WCF und bin nicht mit Sicherheit überhaupt vertraut, so lassen Sie mich wissen, wenn ich nicht genug Detail zur Verfügung gestellt habe

.

UPDATE:

Wie von marc_s , ich mag den WCF-Dienst eine Art von Benutzername / Passwort-Mechanismus sichern. Daraus ergibt sich ein wenig mehr Richtung auf eine Antwort, aber ich bin immer noch etwas verschwommen auf wie , um tatsächlich zu tun.

Weil mein Dienst aktiviert sein muss Streaming, ich habe Basichttpbinding und Transport Level Security (oder?) Zu verwenden; weiter, dass kann das Verfahren in meinem Dienst enthielt nur ein Stream-Objekt übernehmen.

Unter diesen Randbedingungen in Betracht zusammen mit meiner Vorliebe Benutzername / Passwort-Validierung zu verwenden ...

  • Wie soll ich meinen Dienst der Config-Datei ändern, um Benutzername / Passwort Anmeldeinformationen zu erzwingen geliefert werden?
  • Wie wird mein Service, um die angegebenen Anmeldeinformationen zu validieren?
  • Wie wird meine Client-Anwendung Anmeldeinformationen den Dienst übergeben, wenn Sie einen Anruf tätigen?
  • erfordert dies mit SSL, und wenn ja, werden alle Client-Rechner als auch ein Zertifikat benötigen?

UPDATE:

Nach der Erläuterung der Probleme Ich habe mit Sicherung, diesen Dienst zu meinem Chef hatte, wurde ich grünes Licht gegeben, um die Windows-Authentifizierung Route zu versuchen. Leider habe ich bei der Durchführung dieser Art der Authentifizierung mit meinem gestreamte Service (argh) kein Glück hatte. Nachdem Sie die entsprechenden Änderungen vorzunehmen (wie skizziert hier - einzige Ausnahme: dass mein transferMode="Streamed") und meinen Dienst zugreifen, ich mit dem folgenden Fehler vorgestellt wurde:

  

HTTP-Request-Streaming kann nicht in Verbindung mit HTTP-Authentifizierung verwendet werden. Entweder deaktivieren Anfrage Streaming oder anonyme HTTP-Authentifizierung angeben.

Ich stolperte dann auf das folgende Zitat hier , die eine Klarstellung bietet:

  

Sie können keinen Transport Auth tun. mit Streaming. Wenn Sie verwenden HTTP-Request-Streaming haben, werden Sie ohne die Sicherheit zu laufen haben.

     

Die Art und Weise Sicherheit funktioniert, ist:

     

WCF-Client stellt den Server eine HTTP-Anfrage.

     

Der Server antwortet mit etwas zu sagen: „Sie sind nicht berechtigt, senden Sie mir eine grundlegende / verdauen / etc Berechtigungsnachweis.“

     

Der Kunde bekommt die Antwort und sendet seine Nachricht mit den Anmeldeinformationen geheftet.

     

Jetzt wird der Server die Nachricht, überprüft die Anmeldeinformationen, und fährt fort.   Anfrage Streaming wird nicht mit diesem Sicherheitsmuster arbeiten konzipiert. Wenn ja, wäre es wirklich langsam sein, da der Kunde den gesamten Strom senden würde, erhält die Nachricht von dem Server, es wäre nicht autorisiert ist, dann hätte es den gesamten Strom mit Anmeldeinformationen senden.

So, jetzt suche ich nach Meinungen, Wie würden Sie Ihre Streaming-fähigen WCF-Dienst sicher? Wie bereits erwähnt, eine Art von Benutzername / Passwort-Mechanismus wäre vorzuziehen. Fühlen Sie sich frei außerhalb der Box auf diesem zu denken ...

Jede Hilfe ist stark zu schätzen!

War es hilfreich?

Lösung

Nun, fand ich eine Menge von Fragen der Sicherheit / Streaming-Umgebung, während auf diesem Problem zu arbeiten. Der Hack (äh ... äh ... Abhilfe) Ich landete schließlich auf mit dem Gehen war, ein neues Datacontract zu schaffen, die Memorystream erbt und dekorierte mit einer Base Eigenschaft (zum Halten der Daten, die ich gestreamten will) zusammen mit dem entsprechenden Eigenschaften verwendeten für einfache Authentifizierung.

Hier ist die resultierende Datacontract:

[DataContract]
[KnownType( typeof( MemoryStream ) )] 
public class StreamWithCredentials : MemoryStream
{
    [DataMember]
    public Stream BaseStream { get; set; }

    [DataMember]
    public string Username { get; set; }

    [DataMember]
    public string Password { get; set; }
}
wobei der Eingangsparameter meines Dienstes Methode

Die obige Datacontract endet. Die erste Aktion meines Dienst nimmt, ist die angegebenen Anmeldeinformationen gegen bekannte gültige Werte zu authentifizieren und entsprechend fortzusetzen.

Jetzt kann ich weiß , dass dies nicht die sicherste Option, aber meine Richtlinie war zu vermeiden, die Verwendung von SSL (, die ich bin nicht einmal sicher ist möglich sowieso - wie gesagt hier ) für diesen internen Prozess.

Davon abgesehen, war dies die beste Lösung für das oben angegebene Problem, das ich tun konnte, hofft, das hilft jemand anderen mit diesem Problem betroffenen.

Danke an alle, die geantwortet haben.

Andere Tipps

Es gibt eine Reihe von Dingen, die Sie tun können:

  • fügen Sie ein Zertifikat zu jeder Maschine, die Ihren Service zu nutzen erlaubt ist, und für das Zertifikat überprüfen. Das können Sie nur „nicht autorisierte“ Maschinen ausschließen - Sie können es auf eine bestimmte Anwendung nicht einschränken
  • gleiche wie oben, aber schließen Sie das Zertifikat in Ihre WinForms-Anwendung eingebettet und von dort aus senden (nicht speichern es in den Zertifikatspeicher der Maschine)
  • einen Benutzername / Passwort, das nur diese bestimmte App von Ihnen kennt und kann zu Ihrem Dienst übertragen; z.B. jemand würde sonst nicht in der Lage sein, die entsprechenden Anmeldeinformationen zu präsentieren

EDIT 2: OK, so dass der Benutzername / Passwort Ansatz scheint aus der Hand zu bekommen .... was ist, wenn Sie nur grundlegende Transportsicherheit (SSL) für einen Basisschutz haben und dann den MessageContract verwenden Header und Körper zu definieren Ihre SOAP-Nachricht, umfasst einen bestimmten Wert in der Kopfzeile und dann für das Vorhandensein des Elements überprüft gerade im Header in Ihrem Dienst?

So etwas:

[DataContract]
class YourRequestData
{
 ...
}

[MessageContract]
public class YourRequest
{
  [MessageBodyMember]
  public YourRequestData bodyData { get; set; }

  [MessageHeader]
  public string AppThumbprint { get; set; }
}

Und dann auf dem Server in Ihrem Code nur überprüfen, auf das Vorhandensein und die Gültigkeit dieses AppThumbprint Code:

public Stream RequestStream(YourRequest request)
{
  if(AppThumbprintIsValid(request.AppThumbprint))
  {
     .... begin your streaming
  }
}

Das könnte viel sein einfacher als das Benutzername / Passwort Sicherheitsszenario beenden.

Marc

Bitte korrigieren Sie mich, wenn ich falsch bin, aber:

Wenn Sie die Formularauthentifizierung für Ihren WCf Dienst verwenden (auf asp.net), fügen Sie einfach ein Anmeldeverfahren zu Ihren Diensten, in es Sie erstellen die erforderliche Cookie (formsAuthentication.Authenticate ()). die automatisch mit der Antwort gesendet wird, kann der Client dann den Stream API aufrufen, ohne zusätzliche Parameter zu benötigen (eine Voraussetzung für die es STREAM sein) und Sie können die Identität in der Streaming api überprüfen, bevor Sie den zurückkehrenden Strom abfeuern.

Wie für den Zugriff auf die gesamte WCF zu sichern, habe ich das Gefühl, dass ein Zertifikat in der .net app Einbetten einer Art und Weise zu gehen. sie müßten Ihre App ildump um es zu bekommen.

können Sie sagen, asp.net/wcf nicht die WSDL zur Verfügung zu stellen, oder genauer gesagt, nicht automatisch die WSDL-Datei zu generieren. Ohne Wsdl Zugang wird es viel schwieriger für sie, einen Proxy zu generieren ....

Wenn Sie verwenden basicHttpBinding möchten (Interop) Sie nur Ihre Anmeldeinformationen auf Nachrichtenebene passieren kann. Sie haben Ihre Sicherheitskonfiguration auf TransportWithMessageCredential.

Dazu müssen Sie einen SSL-Kanal erstellen müssen, so müssen Sie ein Zertifikat auf Serverseite, und es ist nicht necesary für einen cliente, einen zu haben.

Es ist möglich, Windows-Authentifizierung mit Streaming und SSL zu verwenden, aber Sie müssen TransportWithMessageCredential verwenden:

<basicHttpBinding>
    <binding name="FileService.FileServiceBinding" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" transferMode="Streamed">
        <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
        <security mode="TransportWithMessageCredential">
            <transport clientCredentialType="Windows" />
        </security>
    </binding>
</basicHttpBinding>

Sie müssen in Code proxy.ClientCredentials.UserName.UserName und proxy.ClientCredentials.UserName.Password setzen.

Wenn dies wird eine Anwendung, die im Intranet lebt könnte es am einfachsten sein, nur eine neue Gruppe in Active Directory erstellen und nur geben Mitgliedern dieser Gruppe die Möglichkeit, den Service zu nutzen.

Sie können Authentifizierung hinzufügen (unter Verwendung von Windows-Anmeldeinformationen) mit etwas wie folgt aus:

<basicHttpBinding> 
 <security mode="TransportCredentialOnly"> 
  <transport clientCredentialType="Windows" /> 
 </security> 
</basicHttpBinding> 

Könnte dann autorisieren durch die Schnittstelle zu Ihren Diensten Methoden Dekoration:

<PrincipalPermission(SecurityAction.Demand, Role:="MyAppsUsers")> _ 
Public Function MyMethod() As String Implements IService.MyMethod 

Heres eine gute Verbindung zu Sicherheit in WCF. Es hat viele wie am Ende ist (der eine mit dem Titel ‚How To - Verwenden Basichttpbinding mit Windows-Authentifizierung und TransportCreditals‘ könnte für Sie von Nutzen sein).
Wcf Secruity

[Disclaimer: Ich bin neu auch WCF und nicht genau diesen Fall getan, bevor so entschuldigt, wenn dies leicht off]

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