2016-12-21 3 views
0

je besoin d'un accès à Dynamics CRM 365 i utilise le code ci-dessous pour accéder à ses travaillé très bien avec "ADFS (IFD) authentification", mais avec CRM Online "Dynamics 365 https://OrgName.api.crm4.dynamics.com/XRMServices/2011/Organization.svc"accès à Microsoft Dynamics CRM 365 de .Net

obtenir cette erreur:

Un défaut non sécurisé ou incorrectement sécurisé a été reçu de l'autre partie. Voir le FaultException interne pour le code d'erreur et le détail.

Server stack trace: 
    at System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.ProcessReply(Message reply, SecurityProtocolCorrelationState correlationState, TimeSpan timeout) 
    at System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.Request(Message message, TimeSpan timeout) 
    at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs) 
    at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
    at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 

Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
    at System.ServiceModel.Security.IWSTrustContract.Issue(Message message) 
    at System.ServiceModel.Security.WSTrustChannel.Issue(RequestSecurityToken rst, RequestSecurityTokenResponse& rstr) 
    at Microsoft.Xrm.Sdk.Client.ServiceConfiguration`1.Issue(AuthenticationCredentials authenticationCredentials) 
    at Microsoft.Xrm.Sdk.Client.ServiceConfiguration`1.AuthenticateInternal(AuthenticationCredentials authenticationCredentials) 
    at Microsoft.Xrm.Sdk.Client.ServiceConfiguration`1.AuthenticateWithOrgIdForACS(AuthenticationCredentials authenticationCredentials, Uri identifier) 
    at Microsoft.Xrm.Sdk.Client.ServiceConfiguration`1.AuthenticateOnlineFederationInternal(AuthenticationCredentials authenticationCredentials) 
    at Microsoft.Xrm.Sdk.Client.ServiceConfiguration`1.Authenticate(AuthenticationCredentials authenticationCredentials) 
    at Microsoft.Xrm.Sdk.Client.OrganizationServiceConfiguration.Authenticate(AuthenticationCredentials authenticationCredentials) 

Ce mon code:

public static IOrganizationService GetService() 
{ 

    try 
    { 
     OrganizationServiceProxy _serviceProxy; 

     string userName = ""; 
     string password = ""; 
     string domain = ""; 
     Uri serviceUri; 


     serviceUri = new Uri(ConfigurationManager.AppSettings["URL"]); 
     userName = ConfigurationManager.AppSettings["UserName"]; 
     password = ConfigurationManager.AppSettings["Password"]; 
     domain = ConfigurationManager.AppSettings["domain"]; 


     IServiceManagement<IOrganizationService> orgServiceManagement = ServiceConfigurationFactory.CreateManagement<IOrganizationService>(serviceUri); 

     if (orgServiceManagement.AuthenticationType == AuthenticationProviderType.Federation) 
     { 
      // ADFS (IFD) Authentication 
      ClientCredentials clientCred = new ClientCredentials(); 
      clientCred.UserName.UserName = userName; 
      clientCred.UserName.Password = password; 
      _serviceProxy = new OrganizationServiceProxy(orgServiceManagement, clientCred); 
     } 
     else if (orgServiceManagement.AuthenticationType == AuthenticationProviderType.OnlineFederation) 
     { 
      // Online authentication 
      AuthenticationCredentials authCredentials = new AuthenticationCredentials(); 

      authCredentials.ClientCredentials.UserName.UserName = userName; 
      authCredentials.ClientCredentials.UserName.Password = password; 

      // Error getting here 
      AuthenticationCredentials tokenCredentials = orgServiceManagement.Authenticate(authCredentials); 


      _serviceProxy = new OrganizationServiceProxy(orgServiceManagement, tokenCredentials.SecurityTokenResponse); 
     } 
     else 
     { 
      // On-Premise, non-IFD authentication 
      ClientCredentials credentials = new ClientCredentials(); 
      credentials.Windows.ClientCredential = new NetworkCredential(userName, password, domain); 
      _serviceProxy = new OrganizationServiceProxy(serviceUri, null, credentials, null); 
     } 

     _serviceProxy.EnableProxyTypes(); 


    } 
    catch (Exception e) 
    { 

    } 

    return (IOrganizationService)_serviceProxy; 
} 

Répondre

0

Essayez le correctif de this article:

Pour résoudre ce problème, vous pouvez essayer de supprimer le dossier d'enregistrement du périphérique nommé LiveDeviceID dans votre dossier de profil C :\Utilisateurs\. Ensuite, essayez de vous connecter à nouveau.

+0

Merci pour votre replay, j'ai supprimé le dossier LiveDeviceID mais toujours jeter l'exception. –

0

Ceux-ci peuvent être les raisons pour cela:

  1. Microsoft Azure a désapprouvée d'accès au service de contrôle (ACS)
  2. Microsoft a supprimé Microsoft.Xrm .Client du client SDK CRM 2016 (8.x) car il n'était pas compatible avec les modifications OAuth et l'a remplacé par Microsoft.Xrm.Tooling.Connector.
  3. Microsoft a modifié son code d'authentification SDK en supprimant toutes les références à ACS. En vigueur à partir des versions Microsoft Dynamics CRM Online 2016 Update 1 (v8.1.1) et Microsoft Dynamics 365 (v8.2). Ils ont également supprimé le support Live ID et les dépendances ACS sur le serveur.

https://blogs.msdn.microsoft.com/crm/2017/02/01/dynamics-365-sdk-backwards-compatibility/

La façon proposée d'aller est d'utiliser le Microsoft.Xrm.Tooling.Connector. S'il vous plaît voir l'exemple ci-dessous:

https://msdn.microsoft.com/en-us/library/jj602970.aspx

XML

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <connectionStrings> 
    <!-- Online using Office 365 --> 
    <!-- <add name="Server=CRM Online, organization=contoso, user=someone" 
     connectionString="Url=https://contoso.crm.dynamics.com; [email protected]; Password=password; authtype=Office365"/> --> 

    <!-- On-premises with provided user credentials --> 
    <!-- <add name="Server=myserver, organization=AdventureWorksCycle, user=administrator" 
     connectionString="Url=http://myserver/AdventureWorksCycle; Domain=mydomain; Username=administrator; Password=password; authtype=AD"/> --> 

    <!-- On-premises using Windows integrated security --> 
    <!-- <add name="Server=myserver, organization=AdventureWorksCycle" 
     connectionString="Url=http://myserver/AdventureWorksCycle; authtype=AD"/> --> 

    <!-- On-Premises (IFD) with claims --> 
    <!--<add name="Server=litware.com, organization=contoso, [email protected]" 
     connectionString="Url=https://contoso.litware.com; [email protected]; Password=password; authtype=IFD"/>--> 
    </connectionStrings> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> 
    </startup> 
<system.diagnostics> 
    <trace autoflush="true"/> 
    <sources> 
     <source name="Microsoft.Xrm.Tooling.Connector.CrmServiceClient" switchName="Microsoft.Xrm.Tooling.Connector.CrmServiceClient" switchType="System.Diagnostics.SourceSwitch"> 
     <listeners> 
      <add name="console" type="System.Diagnostics.ConsoleTraceListener"/> 
      <add name="fileListener"/> 
     </listeners> 
     </source> 
     <source name="Microsoft.Xrm.Tooling.CrmConnectControl" switchName="Microsoft.Xrm.Tooling.CrmConnectControl" switchType="System.Diagnostics.SourceSwitch"> 
     <listeners> 
      <add name="console" type="System.Diagnostics.ConsoleTraceListener"/> 
      <add name="fileListener"/> 
     </listeners> 
     </source> 
     <source name="CrmSvcUtil" switchName="CrmSvcUtil" switchType="System.Diagnostics.SourceSwitch"> 
     <listeners> 
      <add name="console" type="System.Diagnostics.ConsoleTraceListener"/> 
      <add name="fileListener"/> 
     </listeners> 
     </source> 
    </sources> 
    <switches> 

     <!--Possible values for switches: Off, Error, Warning, Information, Verbose 
         Verbose:  includes Error, Warning, Info, Trace levels 
         Information: includes Error, Warning, Info levels 
         Warning:  includes Error, Warning levels 
         Error:  includes Error level--> 

     <add name="Microsoft.Xrm.Tooling.CrmConnectControl" value="Off"/> 
     <add name="Microsoft.Xrm.Tooling.Connector.CrmServiceClient" value="Error"/> 
     <add name="CrmSvcUtil" value="Off"/> 
    </switches> 

    <sharedListeners> 
     <add name="fileListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="CrmSvcUtil.log"/> 
    </sharedListeners> 

    </system.diagnostics> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="Microsoft.Xrm.Sdk" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="8.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="Microsoft.Xrm.Sdk.Deployment" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="8.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="Microsoft.ServiceBus" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-2.4.0.0" newVersion="2.4.0.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

Ceci est le code C#

using System; 
using System.Configuration; 
using System.ServiceModel; 

// These namespaces are found in the Microsoft.Crm.Sdk.Proxy.dll assembly 
// located in the SDK\bin folder of the SDK download. 
using Microsoft.Crm.Sdk.Messages; 

// These namespaces are found in the Microsoft.Xrm.Sdk.dll assembly 
// located in the SDK\bin folder of the SDK download. 
using Microsoft.Xrm.Sdk; 
using Microsoft.Xrm.Sdk.Query; 
using Microsoft.Xrm.Tooling.Connector; 

// These namespaces are found in the Microsoft.Xrm.Client.dll assembly 
// located in the SDK\bin folder of the SDK download. 
using System.Collections.Generic; 

namespace Microsoft.Crm.Sdk.Samples 
{ 
    /// <summary> 
    /// This sample uses the CrmConnection class found in the Microsoft.Xrm.Client 
    /// namespace to connect to and authenticate with the organization web service. 
    /// 
    /// Next, the sample demonstrates how to do basic entity operations like create, 
    /// retrieve, update, and delete.</summary> 
    /// <remarks> 
    /// At run-time, you will be given the option to delete all the database 
    /// records created by this program. 
    /// 
    /// No helper code from CrmServiceHelpers.cs is used in this sample.</remarks> 
    /// <see cref="http://msdn.microsoft.com/en-us/library/gg695810.aspx"/> 
    public class SimplifiedConnection 
    { 
     #region Class Level Members 

     private Guid _accountId; 
     private IOrganizationService _orgService; 

     #endregion Class Level Members 

     /// <summary> 
     /// The Run() method first connects to the Organization service. Afterwards, 
     /// basic create, retrieve, update, and delete entity operations are performed. 
     /// </summary> 
     /// <param name="connectionString">Provides service connection information.</param> 
     /// <param name="promptforDelete">When True, the user will be prompted to delete all 
     /// created entities.</param> 
     public void Run(String connectionString, bool promptforDelete) 
     { 
      try 
      { 
       // Connect to the CRM web service using a connection string. 
       CrmServiceClient conn = new Xrm.Tooling.Connector.CrmServiceClient(connectionString); 

       // Cast the proxy client to the IOrganizationService interface. 
       _orgService = (IOrganizationService)conn.OrganizationWebProxyClient != null ? (IOrganizationService)conn.OrganizationWebProxyClient : (IOrganizationService)conn.OrganizationServiceProxy; 

       //Create any entity records this sample requires. 
       CreateRequiredRecords(); 

       // Obtain information about the logged on user from the web service. 
       Guid userid = ((WhoAmIResponse)_orgService.Execute(new WhoAmIRequest())).UserId; 
       SystemUser systemUser = (SystemUser)_orgService.Retrieve("systemuser", userid, 
        new ColumnSet(new string[] { "firstname", "lastname" })); 
       Console.WriteLine("Logged on user is {0} {1}.", systemUser.FirstName, systemUser.LastName); 

       // Retrieve the version of Microsoft Dynamics CRM. 
       RetrieveVersionRequest versionRequest = new RetrieveVersionRequest(); 
       RetrieveVersionResponse versionResponse = 
        (RetrieveVersionResponse)_orgService.Execute(versionRequest); 
       Console.WriteLine("Microsoft Dynamics CRM version {0}.", versionResponse.Version); 

       // Instantiate an account object. Note the use of option set enumerations defined in OptionSets.cs. 
       // Refer to the Entity Metadata topic in the SDK documentation to determine which attributes must 
       // be set for each entity. 
       Account account = new Account { Name = "Fourth Coffee" }; 
       account.AccountCategoryCode = new OptionSetValue((int)AccountAccountCategoryCode.PreferredCustomer); 
       account.CustomerTypeCode = new OptionSetValue((int)AccountCustomerTypeCode.Investor); 

       // Create an account record named Fourth Coffee. 
       _accountId = _orgService.Create(account); 

       Console.Write("{0} {1} created, ", account.LogicalName, account.Name); 

       // Retrieve the several attributes from the new account. 
       ColumnSet cols = new ColumnSet(
        new String[] { "name", "address1_postalcode", "lastusedincampaign" }); 

       Account retrievedAccount = (Account)_orgService.Retrieve("account", _accountId, cols); 
       Console.Write("retrieved, "); 

       // Update the postal code attribute. 
       retrievedAccount.Address1_PostalCode = "98052"; 

       // The address 2 postal code was set accidentally, so set it to null. 
       retrievedAccount.Address2_PostalCode = null; 

       // Shows use of a Money value. 
       retrievedAccount.Revenue = new Money(5000000); 

       // Shows use of a Boolean value. 
       retrievedAccount.CreditOnHold = false; 

       // Update the account record. 
       _orgService.Update(retrievedAccount); 
       Console.WriteLine("and updated."); 

       // Delete any entity records this sample created. 
       DeleteRequiredRecords(promptforDelete); 
      } 

      // Catch any service fault exceptions that Microsoft Dynamics CRM throws. 
      catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>) 
      { 
       // You can handle an exception here or pass it back to the calling method. 
       throw; 
      } 
     } 

     #region Public Methods 
     /// <summary> 
     /// Creates any entity records this sample requires. 
     /// </summary> 
     public void CreateRequiredRecords() 
     { 
      // For this sample, all required entities are created in the Run() method. 
     } 

     /// <summary> 
     /// Deletes any entity records that were created for this sample. 
     /// <param name="prompt">Indicates whether to prompt the user 
     /// to delete the records created in this sample.</param> 
     /// </summary> 
     public void DeleteRequiredRecords(bool prompt) 
     { 
      bool deleteRecords = true; 

      if (prompt) 
      { 
       Console.Write("\nDo you want these entity records deleted? (y/n) [y]: "); 
       String answer = Console.ReadLine(); 

       deleteRecords = (answer.StartsWith("y") || answer.StartsWith("Y") || answer == String.Empty); 
      } 

      if (deleteRecords) 
      { 
       _orgService.Delete(Account.EntityLogicalName, _accountId); 
       Console.WriteLine("Entity records have been deleted."); 
      } 
     } 

     #endregion Public Methods 

     #region Private Methods 

     /// <summary> 
     /// Gets web service connection information from the app.config file. 
     /// If there is more than one available, the user is prompted to select 
     /// the desired connection configuration by name. 
     /// </summary> 
     /// <returns>A string containing web service connection configuration information.</returns> 
     private static String GetServiceConfiguration() 
     { 
      // Get available connection strings from app.config. 
      int count = ConfigurationManager.ConnectionStrings.Count; 

      // Create a filter list of connection strings so that we have a list of valid 
      // connection strings for Microsoft Dynamics CRM only. 
      List<KeyValuePair<String, String>> filteredConnectionStrings = 
       new List<KeyValuePair<String, String>>(); 

      for (int a = 0; a < count; a++) 
      { 
       if (isValidConnectionString(ConfigurationManager.ConnectionStrings[a].ConnectionString)) 
        filteredConnectionStrings.Add 
         (new KeyValuePair<string, string> 
          (ConfigurationManager.ConnectionStrings[a].Name, 
          ConfigurationManager.ConnectionStrings[a].ConnectionString)); 
      } 

      // No valid connections strings found. Write out and error message. 
      if (filteredConnectionStrings.Count == 0) 
      { 
       Console.WriteLine("An app.config file containing at least one valid Microsoft Dynamics CRM " + 
        "connection string configuration must exist in the run-time folder."); 
       Console.WriteLine("\nThere are several commented out example connection strings in " + 
        "the provided app.config file. Uncomment one of them and modify the string according " + 
        "to your Microsoft Dynamics CRM installation. Then re-run the sample."); 
       return null; 
      } 

      // If one valid connection string is found, use that. 
      if (filteredConnectionStrings.Count == 1) 
      { 
       return filteredConnectionStrings[0].Value; 
      } 

      // If more than one valid connection string is found, let the user decide which to use. 
      if (filteredConnectionStrings.Count > 1) 
      { 
       Console.WriteLine("The following connections are available:"); 
       Console.WriteLine("------------------------------------------------"); 

       for (int i = 0; i < filteredConnectionStrings.Count; i++) 
       { 
        Console.Write("\n({0}) {1}\t", 
        i + 1, filteredConnectionStrings[i].Key); 
       } 

       Console.WriteLine(); 

       Console.Write("\nType the number of the connection to use (1-{0}) [{0}] : ", 
        filteredConnectionStrings.Count); 
       String input = Console.ReadLine(); 
       int configNumber; 
       if (input == String.Empty) input = filteredConnectionStrings.Count.ToString(); 
       if (!Int32.TryParse(input, out configNumber) || configNumber > count || 
        configNumber == 0) 
       { 
        Console.WriteLine("Option not valid."); 
        return null; 
       } 

       return filteredConnectionStrings[configNumber - 1].Value; 

      } 
      return null; 

     } 


     /// <summary> 
     /// Verifies if a connection string is valid for Microsoft Dynamics CRM. 
     /// </summary> 
     /// <returns>True for a valid string, otherwise False.</returns> 
     private static Boolean isValidConnectionString(String connectionString) 
     { 
      // At a minimum, a connection string must contain one of these arguments. 
      if (connectionString.Contains("Url=") || 
       connectionString.Contains("Server=") || 
       connectionString.Contains("ServiceUri=")) 
       return true; 

      return false; 
     } 

     #endregion Private Methods 

     #region Main method 

     /// <summary> 
     /// Standard Main() method used by most SDK samples. 
     /// </summary> 
     /// <param name="args"></param> 
     static public void Main(string[] args) 
     { 
      try 
      { 
       // Obtain connection configuration information for the Microsoft Dynamics 
       // CRM organization web service. 
       String connectionString = GetServiceConfiguration(); 

       if (connectionString != null) 
       { 
        SimplifiedConnection app = new SimplifiedConnection(); 
        app.Run(connectionString, true); 
       } 
      } 

      catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> ex) 
      { 
       Console.WriteLine("The application terminated with an error."); 
       Console.WriteLine("Timestamp: {0}", ex.Detail.Timestamp); 
       Console.WriteLine("Code: {0}", ex.Detail.ErrorCode); 
       Console.WriteLine("Message: {0}", ex.Detail.Message); 
       Console.WriteLine("Trace: {0}", ex.Detail.TraceText); 
       Console.WriteLine("Inner Fault: {0}", 
        null == ex.Detail.InnerFault ? "No Inner Fault" : "Has Inner Fault"); 
      } 
      catch (System.TimeoutException ex) 
      { 
       Console.WriteLine("The application terminated with an error."); 
       Console.WriteLine("Message: {0}", ex.Message); 
       Console.WriteLine("Stack Trace: {0}", ex.StackTrace); 
       Console.WriteLine("Inner Fault: {0}", 
        null == ex.InnerException.Message ? "No Inner Fault" : ex.InnerException.Message); 
      } 
      catch (System.Exception ex) 
      { 
       Console.WriteLine("The application terminated with an error."); 
       Console.WriteLine(ex.Message); 

       // Display the details of the inner exception. 
       if (ex.InnerException != null) 
       { 
        Console.WriteLine(ex.InnerException.Message); 

        FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> fe = ex.InnerException 
         as FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>; 
        if (fe != null) 
        { 
         Console.WriteLine("Timestamp: {0}", fe.Detail.Timestamp); 
         Console.WriteLine("Code: {0}", fe.Detail.ErrorCode); 
         Console.WriteLine("Message: {0}", fe.Detail.Message); 
         Console.WriteLine("Trace: {0}", fe.Detail.TraceText); 
         Console.WriteLine("Inner Fault: {0}", 
          null == fe.Detail.InnerFault ? "No Inner Fault" : "Has Inner Fault"); 
        } 
       } 
      } 

      // Additional exceptions to catch: SecurityTokenValidationException, ExpiredSecurityTokenException, 
      // SecurityAccessDeniedException, MessageSecurityException, and SecurityNegotiationException. 

      finally 
      { 
       Console.WriteLine("Press <Enter> to exit."); 
       Console.ReadLine(); 
      } 
     } 
     #endregion Main method 
    } 
}