CRM 2011 SecurityNegotiationException tente d’accéder aux services Web

Obtention d’une erreur inattendue lors de la tentative de connexion au service Web CRM 2011. Voici le fond:

Chaîne de connexion (avec informations confidentielles supprimées): "ServiceUri=https://crmdomain.com/OrgName/XRMServices/2011/Organization.svc; Url=https://crmdomain.com/OrgName; Username=appusername; Password=hidden"/>

Création de la connexion comme suit:

  1. Analyse la chaîne de connexion dans CRMConnection: var conn = Microsoft.Xrm.Client.CrmConnection.Parse(connSsortingng); (à ce stade, les propriétés de l’object CrmConnection semblent correctes, y compris ClientCredentials)
  2. Créer un proxy org: var orgProxy = new OrganizationServiceProxy(conn.ServiceUri, conn.HomeRealmUri, conn.ClientCredentials, conn.DeviceCredentials);
  3. Créer un contexte de données: var context = new MyContext(orgProxy);

À ce stade, lors de l’extraction de données du context , l’exception WCF suivante se produit:

System.ServiceModel.Security.SecurityNegotiationException s’est produit Message = L’appelant n’a pas été authentifié par le service. Source = mscorlib StackTrace: trace de la stack serveur: System.ServiceModel.Security.IssuanceTokenProviderBase ‘. TimeSpan timeout)

… etc.

L’ IsSenderFault=True InnerException indique IsSenderFault=True et IsPredefinedFault=True .

Que se passe t-il ici?

J’ai trouvé la solution. Tout d’abord, veuillez télécharger la version RTW de CRM SDK 2011.

Le code pour la connectivité sera:

 public static IOrganizationService Service() { ClientCredentials Credentials = new ClientCredentials(); Credentials.Windows.ClientCredential.UserName =""; Credentials.Windows.ClientCredential.Password =""; //This URL needs to be updated to match the servername and Organization for the environment. Uri OrganizationUri = new Uri("http:////XRMServices/2011/Organization.svc"); Uri HomeRealmUri = null; //OrganizationServiceProxy serviceProxy; using (OrganizationServiceProxy serviceProxy = new OrganizationServiceProxy(OrganizationUri, HomeRealmUri, Credentials, null)) { IOrganizationService service = (IOrganizationService)serviceProxy; return service; } } 

et vous voilà …

À votre santé! Profitez de la programmation.

Vous voudrez peut-être limiter l’erreur exacte dans CRM à l’aide de la trace CRM. Vous pouvez activer la trace CRM avec un outil dédié et rechercher des informations plus détaillées sur la source de l’exception. Notez que les fichiers de trace deviennent très volumineux très rapidement, il est donc raisonnable de procéder au suivi uniquement pendant l’appel du service Web.