Pergunta

Eu tenho um aplicativo de controle da máquina onde eu tenho um único computador cliente e cinco caixas de servidor de comunicação na sub-rede da máquina. Não há controlador de domínio. Eu gostaria de usar netTcpBinding para permitir a confiabilidade e suporte a transações.

É possível usar a autenticação de nome de usuário / senha com essa ligação, quando um controlador de domínio não está presente? Eu preferiria não usar um certificado como eu não deseja gerenciar certificados em todo 900 computadores (150 máquinas) que não serão conectados ao escritório LAN.

Foi útil?

Solução

Sim, é claro - mas só se você usar a segurança de mensagens (em vez de segurança dos transportes). Defina sua configuração de ligação assim:

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

e, em seguida, referência que a configuração obrigatório em todos os seus endpoints (no servidor e cliente):

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

Marc

UPDATE:
Ah, sim, no lado do servidor, você precisará de um certificado para authenicate o serviço ao cliente chamando-o, e ele também é usado para criptografar + assinar as mensagens. Isso é sobre apenas o servidor -. Cliente não precisa instalar nada

Configuração:

<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>

Certifique-se de instalar o certificado do servidor para a pasta "Local Machine" em seu servidor, sob o "nome do assunto" que especificar na sua configuração.

Outras dicas

Não é algo que você pode tentar em primeiro lugar. Definir serviceNegotiationCredentials para true:

<message negotiateServiceCredential="true"/>

Isto irá criar uma conversa segura entre o cliente e seu serviço sem um controlador de domínio.

Mas, se não houver qualquer controlador de domínio, o cliente não confia no seu serviço, para que ele irá falhar.

Portanto, você deve definir o esperado do serviço . Você pode achar que no WSDL do seu serviço. Por padrão, se você está hospedado no IIS, parece ser:

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

Eu não acho que você vai precisar dele, mas talvez você tem que permitir logon anônimo no lado do serviço:

<serviceBehaviors>
    <behavior>
        <serviceCredentials>
            <windowsAuthentication allowAnonymousLogons="true"/>
        </serviceCredentials>
    </behavior>
</serviceBehaviors>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top