2009-08-03 6 views
9

Mam aplikację do sterowania maszyną, w której mam jeden komputer kliencki i pięć skrzynek serwerowych komunikujących się w podsieci urządzenia. Nie ma kontrolera domeny. Chciałbym użyć netTcpBinding, aby umożliwić niezawodność i wsparcie transakcji.netTcpBinding bez poświadczeń systemu Windows?

Czy jest możliwe używanie uwierzytelniania nazwy użytkownika/hasła z tym wiązaniem, gdy kontroler domeny nie jest obecny? Wolałbym nie używać certyfikatu, ponieważ nie chcę zarządzać certyfikatami na 900 komputerach (150 komputerach), które nie będą połączone z biurową siecią LAN.

Odpowiedz

10

Tak, oczywiście - ale tylko wtedy, gdy używasz zabezpieczenia wiadomości (zamiast bezpieczeństwa transportu). Definiowanie konfiguracji wiązania tak:

<netTcpBinding> 
    <binding name="UserNameSecurity"> 
     <security mode="Message"> 
     <message clientCredentialType="UserName"/> 
     </security> 
    </binding> 
    </netTcpBinding> 

a następnie odwoływać się, że wiązanie konfigurację punktów końcowych (na serwer i klienta):

<endpoint address="....." 
      binding="netTcpBinding" 
      bindingConfiguration="UserNameSecurity" 
      contract="IMyService" /> 

Marc

UPDATE:
Ach, tak, po stronie serwera potrzebny jest certyfikat do uwierzytelniania usługi do klienta, który ją wywołuje, a także do szyfrowania i podpisywania wiadomości. To tylko na serwerze - klienci nie muszą niczego instalować.

Konfiguracja:

<behaviors> 
    <serviceBehavior> 
    <behavior name="ServerInternet"> 
     <serviceCredentials> 
     <serviceCertificate 
      findValue="MyServiceCertificate" 
      storeLocation="LocalMachine" 
      storeName="My" 
      x509FindType="FindBySubjectName" /> 
     </serviceCredentials> 
    </behavior> 
    </serviceBehavior> 
</behaviors> 
<services> 
    <service name="MyServiceInternet" 
      behaviorConfiguration="ServerInternet"> 
    .... 
    </service> 
</services> 

Upewnij się, aby zainstalować certyfikat serwera, do folderu „lokalnego komputera” na serwerze, pod nazwą „” z zastrzeżeniem, że można określić w swojej konfiguracji.

+0

Tak, to było to, co miałem pierwotnie. Ale otrzymuję wyjątek z prośbą o certyfikat usługi: "Certyfikat usługi nie jest dostarczony. Określ certyfikat usługi w ServiceCredentials." Wszelkie pomysły? –

+0

Hmmm. Tak właśnie podejrzewałem. Dzięki za potwierdzenie. –

+0

W tym podejściu istnieje jakakolwiek szkoda w korzystaniu z samopodpisanego certyfikatu w środowisku produkcyjnym? Jeśli służy tylko do szyfrowania wiadomości, ale nie do weryfikacji tożsamości. Kiedy nie używałbyś samopodpisanego certyfikatu do szyfrowania wiadomości? – Vitalik

0

Jest coś, co możesz najpierw wypróbować. Ustaw serviceNegotiationCredentials true:

<message negotiateServiceCredential="true"/> 

Spowoduje to utworzenie bezpiecznego rozmowę między klientem a usługą bez kontrolera domeny.

ALE jeśli nie ma żadnego kontrolera domeny, klient nie ma zaufania do usługi, więc nie powiedzie się.

Powinieneś ustawić oczekiwany identity of the service. Możesz to znaleźć w WSDL swojej usługi. Domyślnie, jeśli są przechowywane w IIS, wydaje się być:

<client> 
    <endpoint> 
     <identity> 
      <servicePrincipalName value="host/NETWORKSERVICE"></servicePrincipalName> 
     </identity> 
    </endpoint> 
</client> 

Nie sądzę, będziesz go potrzebować, ale być może będziesz musiał pozwolić anonimowego logowania na stronie serwisu:

<serviceBehaviors> 
    <behavior> 
     <serviceCredentials> 
      <windowsAuthentication allowAnonymousLogons="true"/> 
     </serviceCredentials> 
    </behavior> 
</serviceBehaviors> 
+1

Dzięki. Myślę, że the negotiateServiceCredential nie istnieje dla netTcpBinding. Prawdopodobnie zejdę ścieżką certyfikatu, ponieważ wydaje się to (stosunkowo) proste. –