none
WCF Autentication RRS feed

  • Pergunta

  • Bom dia,

     

    Precisamos colocar autenticação integrada em uma aplicação WPF consumindo um serviço WCF, sendo que está autenticará no Sql Server com o usuário do Windows.


    Fiz da seguinte maneira no ambiente de desenvolvimento:

    1- Coloquei o atribuito de impersonation na classe que implementa do serviço:
    [

    OperationBehavior(Impersonation = ImpersonationOption.Required)]

    2- Criei um bind com o security mode = message e o clientCredentialType = Windows

    <

     

    bindings>
    <
    netTcpBinding>
    <
    binding name="svrBind">
    <
    security mode="Message">
    <
    message clientCredentialType="Windows"/>
    </
    security>
    </
    binding>
    </
    netTcpBinding>
    </
    bindings>

    3-Criei um Behavior no clliente como delegation

    <

     

    behaviors>
    <
    endpointBehaviors>
    <
    behavior name="EndpointBehavior">
    <
    clientCredentials>
    <windows allowedImpersonationLevel="Delegation"/>
    </
    clientCredentials>
    </
    behavior>
    </
    endpointBehaviors>
    </
    behaviors>

     

    4 - Criei uma camada ChannelAdapter utilizando o svcutil para consumir o serviço no cliente.

    Até ai tudo bem no ambiente de desenvolvimento (localhost). Porém ao publicar o serviço no ambiente de produção, a autenticação integrada não fuciona, retornado a mensagem "Falha de logon do usuário 'NT AUTHORITY\\ANONYMOUS LOGON'. Mas o IIS está configurado como no ambiente de desenvolvimento.

    Obrigado pela ajuda.

    Sem mais

    Otávio


    Otávio de Carvalho
    quinta-feira, 1 de abril de 2010 12:59

Respostas

  • Boas Otavio,

    Não consigo ver nada errado no arquivo de configuração.

    Na tua máquina tudo funciona porque o delegation funciona sem problemas em processos dentro da mesma máquina. O problema é quando você precisa propagar isso entre máquinas, como é o teu caso, e justamente por isso, que te perguntei se estava habilitado na conta do usuário no AD.

    Uma pergunta boba: o acesso anônimo no IIS está desabilitado?
    http://www.israelaece.com
    sexta-feira, 2 de abril de 2010 13:57
    Moderador
  • Boas Otavio,

    Acredito que a conta mencionada ali refere-se a conta dos clientes que consomem os serviços. Não há essa opção também na configuração da conta do usuário no AD?

    Repare também que no AD há nas propriedades dos computadores, uma aba chamada Delegation. Certifique-se de que os computadores permitem isso também.


    http://www.israelaece.com

    segunda-feira, 5 de abril de 2010 15:17
    Moderador

Todas as Respostas

  • Boas Otavio,

    Pode compartilhar o arquivo de configuração do cliente com a referência para o serviço?


    http://www.israelaece.com
    quinta-feira, 1 de abril de 2010 13:01
    Moderador
  •  

     

     <system.serviceModel>
        <bindings>
          <netTcpBinding>
            <binding name="NetTcpBinding_IService1" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01: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="00:10:00"
                  enabled="false" />
              <security mode="Message">
                <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign">
                  <extendedProtectionPolicy policyEnforcement="Never" />
                </transport>
                <message clientCredentialType="Windows" />
              </security>
            </binding>
          </netTcpBinding>
        </bindings>
        <client>
          <endpoint address="net.tcp://siscorp.homologacao.credicitrus.com.br/WCFAutTeste/Service1.svc"
              binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IService1"
              contract="IService1" name="NetTcpBinding_IService1" behaviorConfiguration="EndpointBehavior" >
            <identity>
              <servicePrincipalName value="siscorp.homologacao.credicitrus.com.br" />
            </identity>
          </endpoint>
        </client>
        <behaviors>
          <endpointBehaviors>
            <behavior name="EndpointBehavior">
              <clientCredentials>
                <windows allowedImpersonationLevel="Delegation"/>
              </clientCredentials>
            </behavior>
          </endpointBehaviors>
        </behaviors>
      </system.serviceModel>


    Otávio de Carvalho
    quinta-feira, 1 de abril de 2010 13:08
  • Boas Otavio,

    Está usando o WAS para hospedar o serviço?
    http://www.israelaece.com
    quinta-feira, 1 de abril de 2010 14:24
    Moderador
  • Boas Otavio,

    Você já se certificou de que a conta permite Delegation: http://technet.microsoft.com/en-us/library/cc780217(WS.10).aspx
    http://www.israelaece.com
    quinta-feira, 1 de abril de 2010 14:34
    Moderador
  • Boas Israel,

    Estou hospedando no IIS meus serviços. Já habilitei a Impersontation na configuração do mesmo e a conta do servidor está habilitada para fazer delegation também!!

    E infelizmente nenhuma das opções funcionou!! :(

    Meu serviço esta configurado da seguinte forma:

    <system.serviceModel>
        <bindings>
          <netTcpBinding>
            <binding name="svrBind">
              <security mode="Transport">
                <message clientCredentialType="Windows"/>
              </security>
            </binding>
          </netTcpBinding>
        </bindings>
        <services>
          <service name="WcfService1.Service1" behaviorConfiguration="WcfService1.Service1Behavior">
            <endpoint address="net.tcp://siscorp.homologacao.com.br:808/WCFAutentication/Service1.svc" binding="netTcpBinding" contract="WcfService1.IService1" bindingConfiguration="svrBind">
              <identity>
                <dns value="siscorp.homologacao.com.br" />
                <servicePrincipalName value="siscorp.homologacao.com.br"/>
              </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="WcfService1.Service1Behavior">
              <serviceMetadata httpGetEnabled="false" />
              <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
          </serviceBehaviors>
          <endpointBehaviors>
            <behavior name="EndpointBehavior">
              <dataContractSerializer maxItemsInObjectGraph="2147483647" />
            </behavior>
          </endpointBehaviors>
        </behaviors>
      </system.serviceModel>

    Obrigado

     


    Otávio de Carvalho

    quinta-feira, 1 de abril de 2010 20:03
  • Boas Otavio,

    Não consigo ver nada errado no arquivo de configuração.

    Na tua máquina tudo funciona porque o delegation funciona sem problemas em processos dentro da mesma máquina. O problema é quando você precisa propagar isso entre máquinas, como é o teu caso, e justamente por isso, que te perguntei se estava habilitado na conta do usuário no AD.

    Uma pergunta boba: o acesso anônimo no IIS está desabilitado?
    http://www.israelaece.com
    sexta-feira, 2 de abril de 2010 13:57
    Moderador
  • Boas Otávio,

    Isso também pode ajudar: http://blogs.technet.com/askds/archive/2008/06/13/understanding-kerberos-double-hop.aspx

    How to Configure an Application to Use Constrained Delegation

    Before you can use constrained delegation, the sender, receiver, and the domain controller must be configured to do so. The following procedure lists the steps that enable constrained delegation. For details about the differences between delegation and constrained delegation, see the portion of Windows Server 2003 Kerberos Extensions that discusses constrained discussion.

    1. On the domain controller, clear the Account is sensitive and cannot be delegated check box for the account under which the client application is running.
    2. On the domain controller, select the Account is trusted for delegation check box for the account under which the client application is running.
    3. On the domain controller, configure the middle tier computer so that it is trusted for delegation, by clicking the Trust computer for delegation option.
    4. On the domain controller, configure the middle tier computer to use constrained delegation, by clicking the Trust this computer for delegation to specified services only option.

    For more detailed instructions about configuring constrained delegation, see the following topics on MSDN:


    http://www.israelaece.com
    sexta-feira, 2 de abril de 2010 14:19
    Moderador
  • Bom dia Israel,

    Estou precisando que todos os usuários que acessarem a aplicação passem o token, para que eu possa fazer uma auditoria de todos que a consumirem. Porém no segundo item eu devo especificar uma unica conta para fazer o impersonation, ou esta é somente um conta do serviço?

    Eu também já desabilitei e habilitei o acesso anônimo do IIS e também não funciona!

    Muito obrigado pela ajuda.

    Otavio


    Otávio de Carvalho
    segunda-feira, 5 de abril de 2010 11:55
  • Boas Otavio,

    Acredito que a conta mencionada ali refere-se a conta dos clientes que consomem os serviços. Não há essa opção também na configuração da conta do usuário no AD?

    Repare também que no AD há nas propriedades dos computadores, uma aba chamada Delegation. Certifique-se de que os computadores permitem isso também.


    http://www.israelaece.com

    segunda-feira, 5 de abril de 2010 15:17
    Moderador
  • Boas Israel,

    Cara identificamos o problema por acaso. Nossas maquinas de desenvolvimento está o Seven instalado, e quando referenciamos o serviço o mesmo cria uma tag chamada extentionpolicy que mostra como uma excessão, porem em nossas maquinas de dev funciona sem problema algum. Mas quando publicamos e fomos testar em outra maquina com Windows Vista apresentou o erro de extension Policy em alguamas linhas de config do Sistema. Foi quando removemos as mesmas, e para nossa supresa o tokem começou a chegar na camada do banco de dados. Ufaaaaaa

    Porém gostariamos se você souber de alguma forma de não criar esta tag ao refereciar o mesmo ou rodar o svcutil.exe?

    Mais uma vez muito obrigado pela sua atenção.

    abraços

     


    Otávio de Carvalho
    segunda-feira, 5 de abril de 2010 20:38
  • Boas Otavio,

    Aqui há a explicação para este atributo: http://blogs.msdn.com/drnick/archive/2009/07/28/stumbling-on-extended-protection-policy.aspx, mas analisando no svcutil.exe, eu não vi nenhum parâmetro que me permita omitir a adição deste elemento.
    http://www.israelaece.com
    terça-feira, 6 de abril de 2010 13:39
    Moderador