Möglichkeit, das Hauptobjekt in WCF vom Client zur Serviceseite zu befördern

In WCF würde der Benutzer auf der Clientseite authentifiziert und seine Rollen / Berechtigungen würden in Principal / Identity-Objekten auf der Clientseite gespeichert. Nach der Authentifizierung sollte der Benutzer nur dann in der Lage sein, die Dienstmethode aufzurufen, wenn er eine bestimmte Rolle innehat. Dazu muss ich clientseitige Principal- / Identity-Objekte an die Serviceseite übertragen. Sobald ich jedoch auf der Serviceseite bin, lautet das Hauptobjekt Windows-Prinzipal und Identität ist Windows-Identität. Dadurch kann ich nicht überprüfen, ob die Dienstmethode basierend auf clientseitigen Anmeldeinformationen aufgerufen werden soll.

Kann ich mein Prinzipal- und Identitätsobjekt von der Clientseite auf die Serverseite übertragen? Ich möchte mein Principal-Objekt (Generic Principal) auf die Serverseite übertragen. Ist es möglich? Bitte helfen Sie.

Früher habe ich eine ähnliche Frage wie folgt gestellt:

Übertragen des clientseitig angepassten Principal-Objekts an die WCF-Serviceseite

Ich habe versucht, die Antworten durchzuarbeiten, aber ich konnte mein Hauptziel nicht übertragen.

Hier sind die Details.

Auf derclientseitig mein Principal-Objekt und Identitätsobjekt sieht im Direktfenster beim Debuggen wie folgt aus:

System.Threading.Thread.CurrentPrincipal {System.Security.Principal.GenericPrincipal} [System.Security.Principal.GenericPrincipal]: {System.Security.Principal.GenericPrincipal} Identität: {System.Security.Principal.GenericIdentity} System.Threading. Thread.CurrentPrincipal.Identity {System.Security.Principal.GenericIdentity} [System.Security.Principal.GenericIdentity]: {System.Security.Principal.GenericIdentity} AuthenticationType: "" IsAuthenticated: false Name: ""

Auf derServerseitig mein Hauptobjekt und Identität sieht wie folgt aus:

System.Threading.Thread.CurrentPrincipal {Systemsicherheit.Principal.WindowsPrincipal} [Systemsicherheit.Principal.WindowsPrincipal]: {Systemsicherheit.Principal.WindowsPrincipal} Identität: {Systemsicherheit.Principal.WindowsIdentity} {Systemsicherheit .Principal.WindowsIdentity} [System.Security.Principal.WindowsIdentity]: {System.Security.Principal.WindowsIdentity} AuthenticationType: "NTLM" IsAuthenticated: true Name: "MyDomain \ MyLoginID"

Mein WCF-Client sieht folgendermaßen aus

Kundencode:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceReference1.Service1Client client = new Service1Client("NetTcpBinding_IService1");

            Console.WriteLine(client.GetData(6548));


            Console.ReadLine();
        }
    }
}

Die Client-Konfiguration sieht wie folgt aus:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <netTcpBinding>
                <binding name="NetTcpBinding_IService1" closeTimeout="10:10:00"
                    openTimeout="10:10:00" receiveTimeout="10:10:00" sendTimeout="10:10:00"
                    transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                    hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                    maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
                    maxReceivedMessageSize="65536">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="10:10:00"
                        enabled="false" />
                    <security mode="Transport">
                        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                        <message clientCredentialType="Windows" />
                    </security>
                </binding>
            </netTcpBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://localhost:8888/Service1" binding="netTcpBinding"
                bindingConfiguration="NetTcpBinding_IService1" contract="ServiceReference1.IService1"
                name="NetTcpBinding_IService1">

            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

Der Servicecode sieht wie folgt aus:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    string GetData(int value);

    [OperationContract]
    CompositeType GetDataUsingDataContract(CompositeType composite);

    // TODO: Add your service operations here
}

// Use a data contract as illustrated in the sample below to add composite types to service operations
[DataContract]
public class CompositeType
{
    bool boolValue = true;
    string stringValue = "Hello ";

    [DataMember]
    public bool BoolValue
    {
        get { return boolValue; }
        set { boolValue = value; }
    }

    [DataMember]
    public string StringValue
    {
        get { return stringValue; }
        set { stringValue = value; }
    }
}


public class Service1 : IService1
{
    public string GetData(int value)
    {
        return string.Format("You entered: {0}", value);
    }

    public CompositeType GetDataUsingDataContract(CompositeType composite)
    {
        if (composite == null)
        {
            throw new ArgumentNullException("composite");
        }
        if (composite.BoolValue)
        {
            composite.StringValue += "Suffix";
        }
        return composite;
    }
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage