Usuário com melhor resposta
Autenticação IFD

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
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
-
Tiago,
Da uma olhada nestes links, exemplos de autenticação utilizando IFD:
http://msdn.microsoft.com/en-us/library/cc151054.aspx
http://social.microsoft.com/Forums/en/crmdevelopment/thread/81f8ba82-981d-40dd-893d-3add67436478
Ricardo Alves
www.ricardoalves.me- Marcado como Resposta RicardoAlves quarta-feira, 17 de novembro de 2010 17:17
-
Tiago,
Entendi o seu problema... o jeito é programar de forma não tipada (DynamicEntity) =)
Abraço,
Ricardo Alves
www.ricardoalves.me- Marcado como Resposta Tiago Michelini CardosoMVP, Moderator quarta-feira, 17 de novembro de 2010 16:58
-
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
- Marcado como Resposta Tiago Michelini CardosoMVP, Moderator quinta-feira, 25 de novembro de 2010 16:07
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 -
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!
-
Tiago,
Da uma olhada nestes links, exemplos de autenticação utilizando IFD:
http://msdn.microsoft.com/en-us/library/cc151054.aspx
http://social.microsoft.com/Forums/en/crmdevelopment/thread/81f8ba82-981d-40dd-893d-3add67436478
Ricardo Alves
www.ricardoalves.me- Marcado como Resposta RicardoAlves quarta-feira, 17 de novembro de 2010 17:17
-
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
-
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 -
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
- Editado Tiago Michelini CardosoMVP, Moderator quinta-feira, 18 de novembro de 2010 16:18
-
Tiago,
Entendi o seu problema... o jeito é programar de forma não tipada (DynamicEntity) =)
Abraço,
Ricardo Alves
www.ricardoalves.me- Marcado como Resposta Tiago Michelini CardosoMVP, Moderator quarta-feira, 17 de novembro de 2010 16:58
-
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
-
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 -
-
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 -
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.
-
Seria isso mesmo.
Mas você chegou a testar, utilizando a autenticação por SPLA, persistindo um objeto tipado?
Ricardo Alves
www.ricardoalves.me -
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á...
-
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
-
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
- Editado Tiago Michelini CardosoMVP, Moderator quinta-feira, 18 de novembro de 2010 15:46
-
Isso mesmo Tiago,
Mas você precisa avaliar se realmente o impacto de mudança será menor.
Abraço,
Ricardo Alves
www.ricardoalves.me -
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
- Marcado como Resposta Tiago Michelini CardosoMVP, Moderator quinta-feira, 25 de novembro de 2010 16:07
-
Que bom que o problema foi resolvido.
Agora seu caso fica como documentação rsrs
Abraço,
Ricardo Alves
www.ricardoalves.me -