none
Autenticação IFD RRS feed

  • Pergunta

  • Boa tarde pessoal,

    Após algum tempo sumido, eis que apareço novamente, agora com outro perfil...

    Bom o problema é um pouco complexo, tenho uma página no ISV e herdo a autenticação realizada no form de "sing in", até ai só tive problemas em usar o CRMImpersonator, porém consegui resgatar a autenticação. No load da página tenho várias chamadas ao WS que através de uma session é instânciado apenas uma vez, só que quando preciso fazer outra requisição (após o load) tenho o erro de time out do WS. E para completar isso só ocorre quando testo a aplicação fora da rede do cliente, internamente ou offline ocorre tudo certo.

    É como se após o load a autenticação fosse perdida, por que "time out" ao invés de "não autorizado".

    A única diferença que tenho em relação aos códigos que encontro é que no meu caso não uso o SDK para ter a instância do service, eu uso o WS, fazendo uma espécie de "cast" para gerar o token, vejam:

              Microsoft.Crm.Sdk.CrmAuthenticationToken token;
    ...          
              token = Microsoft.Crm.Sdk.CrmAuthenticationToken.ExtractCrmAuthenticationToken(HttpContext.Current, _orgName);
              token.OrganizationName = _orgName;
              token.AuthenticationType = 0;
    
              // Realiza o "Cast" do objeto da Dll para o do WS
              _token = new CrmAuthenticationToken();
              _token.Actor = token.Actor;
              _token.AuthenticationType = token.AuthenticationType;
              _token.CallerId = token.CallerId;
              _token.CrmTicket = token.CrmTicket;
              _token.DidUnderstand = token.DidUnderstand;
              _token.EncodedMustUnderstand = token.EncodedMustUnderstand;
              _token.EncodedMustUnderstand12 = token.EncodedMustUnderstand12;
              _token.EncodedRelay = token.EncodedRelay;
              _token.MustUnderstand = token.MustUnderstand;
              _token.OrganizationName = token.OrganizationName;
              _token.Relay = token.Relay;
              _token.Role = token.Role;
    

    Desde já agradeço,

    Tiago Cardoso

    terça-feira, 16 de novembro de 2010 18:07
    Moderador

Respostas

  • Tiago,

     

    Já que a quantidade de modificações são grandes, não sei se seria a melhor forma de fazer, mas você poderia fazer um método para conversão os tipos, pois todos herdam de BusinessEntity.

     

    Abraço,

     

     


    Ricardo Alves
    www.ricardoalves.me
    • Marcado como Resposta RicardoAlves quinta-feira, 18 de novembro de 2010 15:30
    quarta-feira, 17 de novembro de 2010 19:06
    • Marcado como Resposta RicardoAlves quarta-feira, 17 de novembro de 2010 17:17
    quarta-feira, 17 de novembro de 2010 14:49
  • Tiago,

     

    Entendi o seu problema... o jeito é programar de forma não tipada (DynamicEntity) =)

     

    Abraço,

     


    Ricardo Alves
    www.ricardoalves.me
    quarta-feira, 17 de novembro de 2010 16:56
  • Apenas para dar um retorno sobre meu problema...

    No final das contas tudo era problema de time out ocasionado pela tentativa de requisição de WS utilizando um update panel do ajax control toolkit e o o agravante era o 3G do local que estou, que é péssimo, eu achava que ele perdia as permissões, porém ele perdia a requisição mesmo!

    Para resolver, desabilitei o enabledpartialrendering quando o acesso ao crm for externo à rede, com isso as requisições são postada "sincronamente" garantindo o retorno das requisições mesmo com sinais baixos de conectividade (não fica limpo e nem w2.0, mas devido as circunstâncias, foi a solução).

    Então podemos concluir que eu fui o primeiro a fazer um "cast" sem vergonha de um CrmService (SDK) para um CrmService (WS), fazendo um "de para", que garante a autenticação via IFD (SPLA) em uma página customizada no ISV.

    Ufa... Não foi dessa vez Ricardo que tive que utilizar as terríveis DynamicsEntities! rsrsrs É muito mais simples utilizar entidades tipadas, não sei o por que não existe nenhum material à respeito do que precisei na Microsoft.

    Muito obrigado pela ajuda e fica o conhecimento à todos.

    []'s,

    Tiago Cardoso

    quinta-feira, 25 de novembro de 2010 16:07
    Moderador

Todas as Respostas

  • Olá Tiago,

     

    Não entendi o seu ambiente... Porque você não pode utilizar a autenticação de forma padrão? Em que local o ISV é chamado?

     

    Abraço,

     


    Ricardo Alves
    www.ricardoalves.me
    terça-feira, 16 de novembro de 2010 21:33
  • Obrigado pela resposta Ricardo,

    Não posso utilizar autenticação padrão, pois tenho acesso interno e externo, por isso uso o IFD.

    O ISV é chamado após um redirect (em javascript) de um form qualquer por exemplo: Clique em "novo" em uma entidade customizada e ela em seu load redireciona para ISV/Empresa/pagina.aspx.

    --- Off-topic

    Por existir esse problema da perca de autenticação, decidi testar usar o CRMDyscoveryService, porém não consigo nem ao menos adicioná-lo no projeto, tentei como um Web Reference e dá "401", o estranho é que nem solicita usuário e senha, e mais faço esse teste em uma máquina que está no mesmo domínio do CRM. O IFD está instalado e consegui logar, o que pode ser?

    Muito obrigado!

    quarta-feira, 17 de novembro de 2010 13:37
    Moderador
    • Marcado como Resposta RicardoAlves quarta-feira, 17 de novembro de 2010 17:17
    quarta-feira, 17 de novembro de 2010 14:49
  • Olá Ricardo,

    Eu já havia lido os dois links, mesmo assim obrigado. Já tentei de muitas formas e não tive sucesso. O mais impressionante é que não consigo acessar o Discovery, nem ao menos pelo browser, isso é normal? Eu vejo os posts e parece a coisa mais comum do mundo, apenas adicionar uma referencia de WS...

     

    Obrigado

    quarta-feira, 17 de novembro de 2010 14:56
    Moderador
  • Tiago,

     

    E que você deve estar autenticando por SPLA, o que não é possivel no browser e nem adicionar web reference, por isso do erro 401...

    /MSCRMServices/2007/SPLA/CrmDiscoveryService.asmx

     

    Tenta por AD:

    /MSCRMServices/2007/AD/CrmDiscoveryService.asmx

     

    No link que passei, tem um exemplo de autenticação por SPLA (lembrando que você não faz web reference):

    http://msdn.microsoft.com/en-us/library/cc151054.aspx

     

    Aqui tem mais um exemplo de autenticação:

    http://msdn.microsoft.com/en-us/library/cc151050.aspx

     

    Abraço,

     


    Ricardo Alves
    www.ricardoalves.me
    quarta-feira, 17 de novembro de 2010 16:17
  • Obrigado Ricardo,

    Não sabia que quando utilizo autenticação por SPLA não conseguiria adicionar o WS... Obrigado.

    Então o seu primeiro exemplo não funcionaria para mim, pois nele existe o WS do Discovery. O segundo eu já usei, fiz uma adaptação para ter o "cast" do service do SDK para o do WS do CRM, pois tenho entidades customizadas e daria um bom trabalho ficar usando DynamicsEntities, não existe mesmo uma autenticação usando CRMImpersonator para SPLA em que retorne um objeto do WS e não do SDK?

    Ai que tá o problema...rs

    quarta-feira, 17 de novembro de 2010 16:34
    Moderador
  • Tiago,

     

    Entendi o seu problema... o jeito é programar de forma não tipada (DynamicEntity) =)

     

    Abraço,

     


    Ricardo Alves
    www.ricardoalves.me
    quarta-feira, 17 de novembro de 2010 16:56
  • Caramba, eu sabia mas não queria escutar isso...

    Talvez aquele cast mirabolante que eu fiz tenha funcionado em partes... Pois eu consegui criar de um objeto SDK um objeto WS, fazendo um "cast sem vergonha", eu consegui me atenticar na página, porém alguma coisa se perde ou não vai. Poxa estou tão perto, parece que existe uma saída, senão não teria conseguido nem a autenticação.

    Tem mais alguma coisa na cartola? rs

    Um abraço

    quarta-feira, 17 de novembro de 2010 17:01
    Moderador
  • Tiago,

     

    Não se compensaria ficar fazendo cast de um lado para outro para escapar da autenticação.

    Acho que trabalhar com DynamicEntity não é tão ruim ;)

     


    Ricardo Alves
    www.ricardoalves.me
    quarta-feira, 17 de novembro de 2010 17:16
  • Caramba, mas estou com uma solução ISV pronta, o que falta é apenas o acesso externo da rede, por isso uso SPLA, imagine o trabalho que vai me dar para usar DynamicEntity em mais de 10 entidades custons?

    quarta-feira, 17 de novembro de 2010 17:21
    Moderador
  • Entendo, já passei por isso... dois ISV que no inicio não iriam ser disponibilizado para acesso externo. Então tive que modificar a autenticação.... Mas a diferença era que os dois já estavam codificados com DynamicEntity.

     

    Pena que no SDK não existe nada a respeito de utilizar impersonate de uma autenticação AD para SPLA.

     

    O que você poderia fazer, é usa autenticação por AD mesmo e fazer o impersonate do ASP.NET (mas é claro, se você estiver trabalhando encima do usuário do contexto a solução não é viável).

     

    Abraço,

     


    Ricardo Alves
    www.ricardoalves.me
    quarta-feira, 17 de novembro de 2010 17:54
  • Não vai dar os registros são de propriedade do usuário logado, o que está propondo é deixar a autenticação por AD e fixar um usuário default, não é?

    Cara fiz uma análise, vou ter pelo menos 50 locais onde terei que deixar de utilizar o SDK, agora me dei mau mesmo... E tem insert, update, select, cada um com suas novas peculiaridades do SDK.

    quarta-feira, 17 de novembro de 2010 18:08
    Moderador
  • Seria isso mesmo.

     

    Mas você chegou a testar, utilizando a autenticação por SPLA, persistindo um objeto tipado?

     


    Ricardo Alves
    www.ricardoalves.me
    quarta-feira, 17 de novembro de 2010 18:19
  • Sim, acabei de fazer um teste, criei um registro na enitdade account usando uma DynamicEntity e funcionou, pegou a autenticação e gravou... É muito mais trabalhoso, visto que tudo já estava feito e funcionando, vai ser um tal de CRMXXProperty prá e para lá...
    quarta-feira, 17 de novembro de 2010 18:54
    Moderador
  • Tiago,

     

    Já que a quantidade de modificações são grandes, não sei se seria a melhor forma de fazer, mas você poderia fazer um método para conversão os tipos, pois todos herdam de BusinessEntity.

     

    Abraço,

     

     


    Ricardo Alves
    www.ricardoalves.me
    • Marcado como Resposta RicardoAlves quinta-feira, 18 de novembro de 2010 15:30
    quarta-feira, 17 de novembro de 2010 19:06
  • Hum uma boa idéia...

    Você quis dizer é pegar uma entidade customizada ("xxx_novaentidade"), passar para um método (ConvertParaBusinessEntity) e lá eu formataria para uma Dynamic e depois um Business? Seria isso?

    Eu encontrei algumas coisas, mas fazem o contrário... Preciso abstrair o que me interessa, usam refletion... Veja:

    http://msdn.microsoft.com/en-us/library/cc151177.aspx

    Obrigado e um abraço

    quinta-feira, 18 de novembro de 2010 14:59
    Moderador
  • Isso mesmo Tiago,

     

    Mas você precisa avaliar se realmente o impacto de mudança será menor.

     

    Abraço,

     


    Ricardo Alves
    www.ricardoalves.me
    quinta-feira, 18 de novembro de 2010 15:30
  • Apenas para dar um retorno sobre meu problema...

    No final das contas tudo era problema de time out ocasionado pela tentativa de requisição de WS utilizando um update panel do ajax control toolkit e o o agravante era o 3G do local que estou, que é péssimo, eu achava que ele perdia as permissões, porém ele perdia a requisição mesmo!

    Para resolver, desabilitei o enabledpartialrendering quando o acesso ao crm for externo à rede, com isso as requisições são postada "sincronamente" garantindo o retorno das requisições mesmo com sinais baixos de conectividade (não fica limpo e nem w2.0, mas devido as circunstâncias, foi a solução).

    Então podemos concluir que eu fui o primeiro a fazer um "cast" sem vergonha de um CrmService (SDK) para um CrmService (WS), fazendo um "de para", que garante a autenticação via IFD (SPLA) em uma página customizada no ISV.

    Ufa... Não foi dessa vez Ricardo que tive que utilizar as terríveis DynamicsEntities! rsrsrs É muito mais simples utilizar entidades tipadas, não sei o por que não existe nenhum material à respeito do que precisei na Microsoft.

    Muito obrigado pela ajuda e fica o conhecimento à todos.

    []'s,

    Tiago Cardoso

    quinta-feira, 25 de novembro de 2010 16:07
    Moderador
  • Que bom que o problema foi resolvido.

     

    Agora seu caso fica como documentação rsrs

     

    Abraço,

     

     


    Ricardo Alves
    www.ricardoalves.me
    quinta-feira, 25 de novembro de 2010 16:32
  • Pois é vou propor como um incremento para o próximo release do sdk! rsrsrsrs
    quinta-feira, 25 de novembro de 2010 17:43
    Moderador