sábado, 29 de agosto de 2015

CRM IFD - Discover Expiration Token

No SDK do CRM existe um código bem extenso que é usado para conexão a qualquer tipo Dynamics CRM - ActiveDirectory, LiveId, Federation e OnlineFederation.

Com certeza este código é bem útil, porém, muito extenso se precisarmos de um recurso para uma versão de autenticação específica, como por exemplo a [Federation - IFD].

Por exemplo, como saber se o meu CRM IFD vai expirar? Neste sentido segue uma classe para nos ajudar a identificar quando o [Token] vai expirar.

Crie a classe [DiscoveryServiceHelper]

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.Description;
using System.Text;
 
public class DiscoveryServiceHelper
{
 public static string GetProxy(string url)
 {
  string httpAux = url.Substring(0, url.IndexOf("//") + 2);
  string urlAux = url.Replace(httpAux, "");
  string urlAux_part1 = urlAux.Substring(0, urlAux.IndexOf("/") + 1);
  string urlAux_part2 = url.Substring(url.IndexOf("XRMServices"));
  urlAux_part2 = urlAux_part2.Replace("Organization.svc", "Discovery.svc");
  string discoveryURL = httpAux + urlAux_part1 + urlAux_part2;
  return discoveryURL;
 }

 public static bool HasCRMProxyExpired(string url, ClientCredentials credentials)
 {
  string discoveryURL = GetProxy(url);
  IServiceManagement<IOrganizationService> serviceManagement;
  serviceManagement = ServiceConfigurationFactory.CreateManagement<IOrganizationService>(new Uri(discoveryURL));
  AuthenticationCredentials authCredentials = new AuthenticationCredentials();
  authCredentials.ClientCredentials = credentials;
  AuthenticationCredentials tokenCredentials = serviceManagement.Authenticate(authCredentials);

  var expired = (tokenCredentials.SecurityTokenResponse != null &&
   DateTime.Now.AddMinutes(15) >=
   tokenCredentials.SecurityTokenResponse.Response.Lifetime.Expires.Value.ToLocalTime());

  return expired;
 }
}


E utilize o método [HasCRMProxyExpired] para descobrir isto. Neste exemplo o código detecta 15 minutos antes se o token vai expirar.

P.S.: Não esqueça de adicionar as bibliotecas [System.ServiceModel.dll], [System.IdentityModel.dll] e [Microsoft.IdentityModel.dll] no seu projeto do Visual Studio. Uma maneira rápida de instalação do WIF (Windows Identity Foundation) é via NuGet do VS, usando o comando: Install-Package Microsoft.IdentityModel. Você pode também habilitá-lo via Painel de Controle -> Programas e Recursos -> Ativar ou desativar recursos do Windows -> Windows Identity Foundation 3.5 .

Ref: Helper code: ServerConnection class

Cheers!