locked
Nutzerdaten übertragen RRS feed

  • Frage

  • Hallo,
     
    ich habe einen WCF-Service, den ich mit Zertifikaten gesichert habe
    (Transport-Sercurity).
     
    Ich möchte jetzt bei jedem Aufruf des Services auch einen Nutzernamen
    mitschicken, da das Zertifikat auch von anderen Clients verwendet wird
    und hierüber keine eindeutige Identifizierung des Nutzers möglich ist.
    Der Service soll aber jedesmal den Client Identifizieren können und ich
    möchte nicht bei jedem Funktionsaufruf einen Nutzernamen mitgeben.
     
    Wie wird das gelöst?
     
    Gibt es irgendeine Möglichkeit, dem ServiceSecurityContext oder
    OperationContext diese Information hinzuzufügen?
     
    Bisher habe ich eine Lösung mit MessageInspektoren mit denen ich
    jedesmal einen Nutzernamen mitschicken kann, jedoch habe ich mir sagen
    lassen es gäbe da vielleicht Probleme, wenn man später größere
    Nachrichten/Daten streamen will.
     
    Ich wäre für Hinweise und einfache Lösungen sehr Dankbar
     
    LG
    Jens
     
    PS: Leider falschen Betreff in der vorigen Nachricht eingesetzt, daher
    noch einmal mit richtigem Betreff gepostet. Sorry
     

    JEns D.
    Mittwoch, 20. Oktober 2010 18:49

Antworten

  • Nur zur Info,

    ich habe für die Identifizierung nun einen MessageInspektor hinzugefügt, der den jeweiligen OperationContext füllt die Header der Soap-Nachrichten um einen Weiteren zur Identifikation ergänzt.

     

    Gru?


    JEns D.
    • Als Antwort markiert Jens D. _ Donnerstag, 24. März 2011 15:27
    Donnerstag, 24. März 2011 15:27

Alle Antworten

  • Hallo Thomas,
     
    vielen Dank für Deine Antwort. Um zu beschreiben, was ich darüber hinaus
    suche, sage ich noch einmal kurz, was ich habe:
     
    Clients verbinden sich mit dem Service auf einer Transportgesicherten
    Verbindung. Dazu verwende ich bei jedem Client das gleiche Zertifikat.
    Anhand des Zertifikats ist es also dem Service nicht möglich, den Client
    eindeutig zu identifizieren.
     
    Was ich jetzt möchte ist, zusätzlich einen Nutzernamen o.ä. übertragen
    und dies, wenn möglich, nicht mit jedem Funktionsaufruf durch den jew.
    Client sondern es wäre schön, wenn ich diese Information weiter in ein
    Credential packen könnte, das jeder Verbindung hinzugefügt ist. Wenn ich
    aber:
     
    am Client:
     
    var factory1 = new ChannelFactory<IService>("*");
    factory1.Credentials.UserName.UserName = "bob";
    factory1.Credentials.UserName.Password = "bob";
     
    var proxy = factory1.CreateChannel();
     
    diese Credentials setze, dann aber die Zertifikate und die
    Transportverschlüsselung noch hinzufüge, dann kann ich:
     
    am Service mit:
     
    ServiceSecurityContext.Current.PrimaryIdentity.Name
     
    nicht mehr auf "bob" zugreifen, sondern habe den Namen/Info des Zertifikats.
     
    Mein Wunsch "darüber hinaus" wäre, an irgend einer Stelle wieder auf
    "bob" zu treffen, ohne z.B. mit einem Messageinspektor alles von Hand
    machen zu müssen.
     
    Gibt es diese Möglichkeit? Es muss nicht unbedingt über diese
    Credentials gehen, aber ich hatte gehofft, auf diesem Weg noch die Daten
    des Nutzers mitgeben zu können - ohne viel Aufwand.
     
    LG
    Jens
     
    PS: Genaugenommen wäre "bob" eine GUID als SessionID, die bei einer
    Anmeldung des Clients gestartet wurde und anhand derer er immer wieder
    identifiziert werden soll.
     
     
    Am 20.10.2010 21:08, schrieb Thomas Scheidegger Dev:
    > Hallo Jens
    >
    > was seitens WCF hier eigentlich möglich ist:
    > Client Credential
    > http://msdn.microsoft.com/en-us/library/ms733836.aspx
    > http://msdn.microsoft.com/en-us/library/ms732391.aspx
    > http://blogs.msdn.com/b/pedram/archive/2007/10/05/wcf-authentication-custom-username-and-password-validator.aspx
    > http://www.google.com/search?q=wcf+%2Bclient+Credential+Certificate
    > <http://www.google.com/search?q=wcf+%2Bclient+Credential+Certificate>
    >
    > oder was darüber hinaus suchst du genau?
    >
     
     

    JEns D.
    Donnerstag, 21. Oktober 2010 14:08
  • Danke für die Antwort, ich poste hier, weil im anderen Forum keine
    Antwort kam.
     
    Ich habe auf der Liste unten begonnen
    (
    >
    http://weblogs.asp.net/cibrax/archive/2008/01/22/authenticating-users-with-supporting-tokens-in-wcf.aspx
    > http://www.leastprivilege.com/UserNameSupportingTokenInWCF.aspx
    )
     
    und leider immer das Problem, dass ich das Binding nicht richtig
    einrichten kann.
    Ich habe das Binding schon mit der App.config konfiguriert und möchte
    diese "Tokens" nun hinzufügen.
    Leider komme ich nicht über diese Fehlermeldung hinaus:
     
    Binding 'CustomBinding' doesn't support creating any channel types. This
    often i
    ndicates that the BindingElements in a CustomBinding have been stacked
    incorrect
    ly or in the wrong order. A Transport is required at the bottom of the
    stack. Th
    e recommended order for BindingElements is: TransactionFlow,
    ReliableSession, Se
    curity, CompositeDuplex, OneWay, StreamSecurity, MessageEncoding, Transport.
     
    Die Position des hinzugefügten Elements ist dabei egal, ich hab jede
    ausprobiert... Ich benutze Tcp-Binding und Zertifikate für
    Transportsicherheit. Leider ist immer nur die PrimaryIdentity mit dem
    Zertifikat belegt, die WindowsIdentity Anonym und alles was ich sonst
    hinzufüge kommt nicht beim Service an.
     
     
    Ist vielleicht die Fehlermeldung ein Hinweis, der Dich zu weiteren Tipps
    verleiten könnte? Ich bin da ratlos..
     
    Vielen Dank für jede Hilfe!
    Jens
     
     
     
     
    Ok, jetzt ein intensiver Blick auf die anderen Links..
    >
    http://blogs.msdn.com/b/drnick/archive/2007/11/28/using-supporting-tokens.aspx
    Eine freundliche Aufzählung, aber das hat mir nicht geholfen.
     
     
    >
    http://blogs.msdn.com/b/sajay/archive/2006/12/12/passing-a-username-as-a-supporting-token.aspx
    Da ich TCP-Binding habe scheint dies nicht zu funktionieren.
     
    >
    http://blogs.msdn.com/b/sajay/archive/2006/12/12/web-hosted-sample-with-usernamepassword-supporting-token.aspx
    Der IIS hat mich vollständig abgeschreckt, ich vermute, das trifft nicht
    auf mein Problemchen zu.
     
    Am Ende des ersten Threads
    (
    > evtl. geht dieser (alte, längere) Thread in diese Richtung:
    > /Mixed credentials: Username & Certificate/
    >
    http://social.msdn.microsoft.com/forums/en-US/wcf/thread/6db5c3db-84b1-40fe-8518-83d9aa40f100
    )
    hat jemand genau meine Frage, aber es gab keine Antwort mehr =(
     
    is it possible to achieve the same without IIS webhttpbinding using
    self-hosting and net.tcp binding?
    because i can't seem to get it to work :)
     

    JEns D.
    Freitag, 29. Oktober 2010 15:39
  • Nur zur Info,

    ich habe für die Identifizierung nun einen MessageInspektor hinzugefügt, der den jeweiligen OperationContext füllt die Header der Soap-Nachrichten um einen Weiteren zur Identifikation ergänzt.

     

    Gru?


    JEns D.
    • Als Antwort markiert Jens D. _ Donnerstag, 24. März 2011 15:27
    Donnerstag, 24. März 2011 15:27