Microsoft.Data.SqlClient.TdsParser.SendFedAuthToken NullReferenceException

672 Views Asked by At

I am trying to connect to the Dynamics 365 database from my C# application with the Microsoft.Data.SqlClient.dll using this code:

    var builder = new SqlConnectionStringBuilder
    {
        ApplicationName = "MyApp",
        InitialCatalog = "<client_id>",
        DataSource = "<client_id>.crm4.dynamics.com",
        Authentication = SqlAuthenticationMethod.ActiveDirectoryPassword,
        UserID = "<my_username>",
        Password = "<my_password>",
        Pooling = false,
        Encrypt = false,
        TrustServerCertificate = true,
        MultipleActiveResultSets = true
    };
    
    using (var con = new Microsoft.Data.SqlClient.SqlConnection(builder.ConnectionString))
    {
         try
         {
             con.Open();
         }
         catch (Exception ex)
         {
             Console.WriteLine(ex.Message);
         }
    }

but I get the following error on the conn.Open() line:

System.NullReferenceException
  HResult=0x80004003
  Message=Object reference not set to an instance of an object. 
  Source=Microsoft.Data.SqlClient
  StackTrace:
   at Microsoft.Data.SqlClient.TdsParser.SendFedAuthToken(SqlFedAuthToken fedAuthToken) in D:\a\_work\1\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\SqlClient\TdsParser.cs:line 9272
   at Microsoft.Data.SqlClient.SqlInternalConnectionTds.OnFedAuthInfo(SqlFedAuthInfo fedAuthInfo) in D:\a\_work\1\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\SqlClient\SqlInternalConnectionTds.cs:line 2687
   at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) in D:\a\_work\1\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\SqlClient\TdsParser.cs:line 2693
   at Microsoft.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) in D:\a\_work\1\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\SqlClient\TdsParser.cs:line 2230
   at Microsoft.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK) in D:\a\_work\1\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\SqlClient\SqlInternalConnectionTds.cs:line 1447
   at Microsoft.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover, Boolean isFirstTransparentAttempt, Boolean disableTnir) in D:\a\_work\1\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\SqlClient\SqlInternalConnectionTds.cs:line 2318
   at Microsoft.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) in D:\a\_work\1\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\SqlClient\SqlInternalConnectionTds.cs:line 1852
   at Microsoft.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance) in D:\a\_work\1\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\SqlClient\SqlInternalConnectionTds.cs:line 1725

The problem disappears (the connection opens correctly) when I replace Microsoft.Data.SqlClient with System.Data.SqlClient, but I can't do it because I also want to use Authentication = SqlAuthenticationMethod.ActiveDirectoryInteractive to handle 2FA. The ActiveDirectoryInteractive is not present in the System.Data.SqlClient DLL.

Does anyone have any idea how to fix that issue and open the connection using the Microsoft.Data.SqlClient DLL?

0

There are 0 best solutions below