Authentifizierung mit dem TCP-Channel

Dieses Thema bezieht sich auf eine veraltete Technologie, die zum Zwecke der Abwärtskompatibilität mit vorhandenen Anwendungen beibehalten wird und nicht für die neue Entwicklung empfohlen wird. Verteilte Anwendungen sollten jetzt mit  Windows Communication Foundation (WCF) entwickelt werden.

Der TCP-Channel bietet eine direkte Unterstützung für Authentifizierung und Identitätswechsel. In diesem Thema wird beschrieben, wie der Client- und der Serverchannel konfiguriert werden.

Mit .NET Framework können Server von Remoteobjekten Aufrufer authentifizieren und imitieren, indem sie die Eigenschaften des zugeordneten TcpServerChannel-Objekts und des TcpClientChannel-Objekts festlegen.

Serverkonfiguration

Um einen TCP-Serverchannel zum Authentifizieren von Remoteaufrufern zu konfigurieren, legen Sie die secure-Eigenschaft wie in der folgenden Konfigurationsdatei gezeigt auf dem TCP-Channel auf true fest.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
              <channel ref="tcp" secure="true" />
             </channels>
        </application>
    </system.runtime.remoting>
</configuration>
59hafwyt.note(de-de,VS.100).gifHinweis:
Die secure-Eigenschaft auf dem Clientchannel muss ebenfalls auf true festgelegt werden, damit eine sichere Kommunikation stattfindet. Standardmäßig umfasst die sichere Kommunikation eine Authentifizierung und Verschlüsselung der Daten, die zwischen dem Server und dem Client übertragen werden.

Es besteht die Möglichkeit, auf die Identität des authentifizierten Clients zuzugreifen, indem CurrentPrincipal abgerufen und dann auf die zugehörige Identity-Eigenschaft zugegriffen wird. Auf die Identität des imitierten Clients kann durch GetCurrent zugegriffen werden. Sie können dann nach Bedarf eine eigene Autorisierung ausführen.

Wenn Sie einen TCP-Serverchannel konfigurieren möchten, um Remoteaufrufer zu authentifizieren und zu imitieren, legen Sie die secure-Eigenschaft und die impersonate-Eigenschaft wie in der folgenden Konfigurationsdatei gezeigt auf true fest.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
              <channel ref="tcp" secure="true" impersonate="true" />
             </channels>
        </application>
    </system.runtime.remoting>
</configuration>
59hafwyt.note(de-de,VS.100).gifHinweis:
Damit ein Identitätswechsel vorgenommen wird, muss die tokenImpersonationLevel-Eigenschaft auf dem Clientchannel auf impersonation oder auf delegation festgelegt werden. Beachten Sie, dass die Eigenschaft auf dem Server impersonate heißt, auf dem Client jedoch tokenImpersonationLevel auf impersonation gesetzt wird.

59hafwyt.note(de-de,VS.100).gifHinweis:
Alle Prozesse werden unter einem Standardbenutzerkonto auf Windows Vista ausgeführt. Standardbenutzer können kein Administratorkonto imitieren. Wenn Sie über eine Remoteanwendung verfügen, die die Identität eines Administratorkontos annehmen muss, dann muss diese Anwendung mit erweiterten Berechtigungen ausgeführt werden.

Die authorizationModule-Eigenschaft ermöglicht es dem Server, seine eigene Autorisierung durchzuführen. Um diese Eigenschaft verwenden zu können, müssen Sie eine Klasse erstellen, die IAuthorizeRemotingConnection implementiert. Diese Schnittstelle enthält die folgenden Methoden:

  • IsConnectingEndpointAuthorized, mit der Sie einen Client über die IP-Adresse autorisieren können.

  • IsConnectingIdentityAuthorized, mit der Sie einen Client über die Identität autorisieren können.

In der Konfigurationsdatei des Servers legen Sie, wie in der folgenden Konfigurationsdatei gezeigt, die authorizationModule-Eigenschaft auf die Klasse fest, die IAuthorizeRemotingConnection in einer Zeichenfolge mit dem Format "namespace.class, assembly" implementiert.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.runtime.remoting>
    <application name="AuthorizationApp">
      <service>
        <wellknown mode="SingleCall"
                   type="Server.SampleService, Server"
                   objectUri="Server.rem"/>
      </service>

      <channels>
        <channel ref="tcp" port="8001" secure="true" impersonate="true" authorizationModule="Server.AuthorizationModule,Server"/>
      </channels>
    </application>
  </system.runtime.remoting>
</configuration>

Clientkonfiguration

Wenn Sie einen TCP-Clientchannel zum Authentifizieren eines Aufrufers konfigurieren möchten, legen Sie die secure-Eigenschaft auf dem TCP-Channel wie in der folgenden Konfigurationsdatei gezeigt auf true fest.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
              <channel ref="tcp" secure="true" />
             </channels>
        </application>
    </system.runtime.remoting>
</configuration>
59hafwyt.note(de-de,VS.100).gifHinweis:
Die secure-Eigenschaft auf dem Serverchannel muss ebenfalls auf true festgelegt werden, damit eine sichere Kommunikation stattfindet. Standardmäßig umfasst die sichere Kommunikation eine Authentifizierung und Verschlüsselung der Daten, die zwischen dem Server und dem Client übertragen werden.

Um einen TCP-Clientchannel für einen Identitätswechsel zu konfigurieren, legen Sie, wie in der folgenden Konfigurationsdatei gezeigt, die secure-Eigenschaft auf true und die tokenImpersonationLevel-Eigenschaft auf impersonation fest.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
              <channel ref="tcp" secure="true" tokenImpersonationLevel="impersonation"/>
             </channels>
        </application>
    </system.runtime.remoting>
</configuration>
59hafwyt.note(de-de,VS.100).gifHinweis:
Damit ein Identitätswechsel vorgenommen wird, muss die impersonate-Eigenschaft auf dem Serverchannel auf true festgelegt werden. Beachten Sie, dass die Eigenschaft auf dem Server impersonate heißt, auf dem Client jedoch tokenImpersonationLevel auf impersonation gesetzt wird.

59hafwyt.note(de-de,VS.100).gifHinweis:
Alle Prozesse werden unter einem Standardbenutzerkonto auf Windows Vista ausgeführt. Standardbenutzer können kein Administratorkonto imitieren. Wenn Sie über eine Remoteanwendung verfügen, die die Identität eines Administratorkontos annehmen muss, dann muss diese Anwendung mit erweiterten Berechtigungen ausgeführt werden.

tokenImpersonationLevel kann auf einen der in der folgenden Tabelle aufgelisteten Werte festgelegt werden.

tokenImpersonationLevel-Einstellung Beschreibung

Identifikation

Der Server kann zwar Informationen zum Client abrufen (z. B. die Sicherheits-IDs und Sicherheitsberechtigungen), er kann den Client jedoch nicht imitieren.

Identitätswechsel

Der Server kann den Sicherheitskontext des Clients auf seinem lokalen System imitieren. Der Server kann den Client auf Remotesystemen nicht imitieren.

Delegierung

Der Server kann den Client auf Remotesystemen imitieren.

Standardmäßig authentifiziert sich ein TCP-Clientchannel mit der Benutzeridentität, unter der der Clientprozess ausgeführt wird. Sie können eine alternative Identität angeben, indem Sie, wie im folgenden Codebeispiel gezeigt, die Eigenschaften domain, username und password zur Angabe einer alternativen Identität festlegen.

RemotingConfiguration.Configure("Client.exe.config", true);
ISharedInterface remoteObject = (ISharedInterface)Activator.GetObject(
                typeof(ISharedInterface),
                "tcp://localhost:8001/server.rem");

// Set domain, username, and password
IDictionary props = ChannelServices.GetChannelSinkProperties(remoteObject);
props["domain"] = "SomeDomain"; // only required if the user is a member of a domain
props["username"] = "SomeRemotingUser";
props["password"] = "Password123";

// Call method on remote object
remoteObject.HelloWorld("Hi Server");

Sie können die Eigenschaften domain, username und password auch in einer Konfigurationsdatei angeben.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
              <channel ref="tcp" 
                       secure="true" 
                       tokenImpersonationLevel="impersonation"
                       username="SomeRemotingUser"
                       password="Password123"
                       />
             </channels>
        </application>
    </system.runtime.remoting>
</configuration>
59hafwyt.note(de-de,VS.100).gifHinweis:
Eine Hartcodierung von Benutzernamen und Kennwörtern in Code oder Konfiguration wird nicht empfohlen. Diese Codierung erfolgt hier nur zu Illustrationszwecken. Die beste Methode zum Abrufen von Anmeldeinformationen ist die, den Benutzer zur Eingabe dieser Informationen aufzufordern.

Standardmäßig verwendet der TCP-Channel NTLM, um Aufrufer zu authentifizieren. Um den Channel zur Verwendung von Kerberos zu zwingen, legen Sie die servicePrincipalName-Eigenschaft wie in der folgenden Konfigurationsdatei gezeigt auf das Konto fest, unter dem der Dienst ausgeführt wird.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
              <channel ref="tcp" secure="true" tokenImpersonationLevel="impersonation"
                       servicePrincipalName="MyDomain\MyUserAccount"/>
          </channels>
        </application>
    </system.runtime.remoting>
</configuration>
59hafwyt.note(de-de,VS.100).gifHinweis:
Kerberos erfordert Zugriff auf einen Active Directory-Server. Verwenden Sie stattdessen NTLM (die Standardeinstellung), wenn die Computer, die den Code ausführen, keine Member einer Active Directory-Domäne sind.

Siehe auch

Konzepte

Verschlüsselung und Nachrichtenintegrität
Authentifizierung mit dem HTTP-Channel
Authentifizierung mit dem IPC-Channel