Skip to content

Commit 7f7b547

Browse files
Backport PR 1213: Fix Async thread blocking on SqlConnection open for AAD modes
1 parent b689674 commit 7f7b547

File tree

19 files changed

+75
-33
lines changed

19 files changed

+75
-33
lines changed

src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlInternalConnectionTds.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2352,7 +2352,9 @@ internal SqlFedAuthToken GetFedAuthToken(SqlFedAuthInfo fedAuthInfo)
23522352
}
23532353
else
23542354
{
2355-
_fedAuthToken = authProvider.AcquireTokenAsync(authParamsBuilder).Result.ToSqlFedAuthToken();
2355+
// We use Task.Run here in all places to execute task synchronously in the same context.
2356+
// Fixes block-over-async deadlock possibilities https://github.com/dotnet/SqlClient/issues/1209
2357+
_fedAuthToken = Task.Run(async () => await authProvider.AcquireTokenAsync(authParamsBuilder)).GetAwaiter().GetResult().ToSqlFedAuthToken();
23562358
_activeDirectoryAuthTimeoutRetryHelper.CachedToken = _fedAuthToken;
23572359
}
23582360
break;
@@ -2368,7 +2370,7 @@ internal SqlFedAuthToken GetFedAuthToken(SqlFedAuthInfo fedAuthInfo)
23682370
else
23692371
{
23702372
authParamsBuilder.WithUserId(ConnectionOptions.UserID);
2371-
_fedAuthToken = authProvider.AcquireTokenAsync(authParamsBuilder).Result.ToSqlFedAuthToken();
2373+
_fedAuthToken = Task.Run(async () => await authProvider.AcquireTokenAsync(authParamsBuilder)).GetAwaiter().GetResult().ToSqlFedAuthToken();
23722374
_activeDirectoryAuthTimeoutRetryHelper.CachedToken = _fedAuthToken;
23732375
}
23742376
break;
@@ -2384,13 +2386,13 @@ internal SqlFedAuthToken GetFedAuthToken(SqlFedAuthInfo fedAuthInfo)
23842386
{
23852387
username = _credential.UserId;
23862388
authParamsBuilder.WithUserId(username).WithPassword(_credential.Password);
2387-
_fedAuthToken = authProvider.AcquireTokenAsync(authParamsBuilder).Result.ToSqlFedAuthToken();
2389+
_fedAuthToken = Task.Run(async () => await authProvider.AcquireTokenAsync(authParamsBuilder)).GetAwaiter().GetResult().ToSqlFedAuthToken();
23882390
}
23892391
else
23902392
{
23912393
username = ConnectionOptions.UserID;
23922394
authParamsBuilder.WithUserId(username).WithPassword(ConnectionOptions.Password);
2393-
_fedAuthToken = authProvider.AcquireTokenAsync(authParamsBuilder).Result.ToSqlFedAuthToken();
2395+
_fedAuthToken = Task.Run(async () => await authProvider.AcquireTokenAsync(authParamsBuilder)).GetAwaiter().GetResult().ToSqlFedAuthToken();
23942396
}
23952397
_activeDirectoryAuthTimeoutRetryHelper.CachedToken = _fedAuthToken;
23962398
}
@@ -2444,8 +2446,9 @@ internal SqlFedAuthToken GetFedAuthToken(SqlFedAuthInfo fedAuthInfo)
24442446
|| _timeout.MillisecondsRemaining <= sleepInterval)
24452447
{
24462448
SqlClientEventSource.Log.TryTraceEvent("<sc.SqlInternalConnectionTds.GetFedAuthToken.MSALException error:> {0}", msalException.ErrorCode);
2449+
24472450
// Error[0]
2448-
SqlErrorCollection sqlErs = new SqlErrorCollection();
2451+
SqlErrorCollection sqlErs = new();
24492452
sqlErs.Add(new SqlError(0, (byte)0x00, (byte)TdsEnums.MIN_ERROR_CLASS, ConnectionOptions.DataSource, StringsHelper.GetString(Strings.SQL_MSALFailure, username, ConnectionOptions.Authentication.ToString("G")), ActiveDirectoryAuthentication.MSALGetAccessTokenFunctionName, 0));
24502453

24512454
// Error[1]
@@ -2632,7 +2635,7 @@ internal void OnFeatureExtAck(int featureId, byte[] data)
26322635
Debug.Assert(_tceVersionSupported <= TdsEnums.MAX_SUPPORTED_TCE_VERSION, "Client support TCE version 2");
26332636
_parser.IsColumnEncryptionSupported = true;
26342637
_parser.TceVersionSupported = _tceVersionSupported;
2635-
_parser.AreEnclaveRetriesSupported = _tceVersionSupported == 3;
2638+
_parser.AreEnclaveRetriesSupported = _tceVersionSupported == 3;
26362639

26372640
if (data.Length > 1)
26382641
{

src/Microsoft.Data.SqlClient/netcore/src/Resources/Strings.Designer.cs

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Microsoft.Data.SqlClient/netcore/src/Resources/Strings.resx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1348,7 +1348,7 @@
13481348
<value>Failed to authenticate the user {0} in Active Directory (Authentication={1}).</value>
13491349
</data>
13501350
<data name="SQL_MSALInnerException" xml:space="preserve">
1351-
<value>Error code 0x{0}; state {1}</value>
1351+
<value>Error code 0x{0}</value>
13521352
</data>
13531353
<data name="SQL_ParsingErrorWithState" xml:space="preserve">
13541354
<value>Internal connection fatal error. Error state: {0}.</value>

src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/Common/DbConnectionStringCommon.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -705,7 +705,7 @@ internal static string ColumnEncryptionSettingToString(SqlConnectionColumnEncryp
705705

706706
internal static bool IsValidAuthenticationTypeValue(SqlAuthenticationMethod value)
707707
{
708-
Debug.Assert(Enum.GetNames(typeof(SqlAuthenticationMethod)).Length == 9, "SqlAuthenticationMethod enum has changed, update needed");
708+
Debug.Assert(Enum.GetNames(typeof(SqlAuthenticationMethod)).Length == 10, "SqlAuthenticationMethod enum has changed, update needed");
709709
return value == SqlAuthenticationMethod.SqlPassword
710710
|| value == SqlAuthenticationMethod.ActiveDirectoryPassword
711711
|| value == SqlAuthenticationMethod.ActiveDirectoryIntegrated

src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlInternalConnectionTds.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2790,7 +2790,9 @@ internal SqlFedAuthToken GetFedAuthToken(SqlFedAuthInfo fedAuthInfo)
27902790
}
27912791
else
27922792
{
2793-
fedAuthToken = authProvider.AcquireTokenAsync(authParamsBuilder).Result.ToSqlFedAuthToken();
2793+
// We use Task.Run here in all places to execute task synchronously in the same context.
2794+
// Fixes block-over-async deadlock possibilities https://github.com/dotnet/SqlClient/issues/1209
2795+
fedAuthToken = Task.Run(async () => await authProvider.AcquireTokenAsync(authParamsBuilder)).GetAwaiter().GetResult().ToSqlFedAuthToken();
27942796
_activeDirectoryAuthTimeoutRetryHelper.CachedToken = fedAuthToken;
27952797
}
27962798
break;
@@ -2806,7 +2808,7 @@ internal SqlFedAuthToken GetFedAuthToken(SqlFedAuthInfo fedAuthInfo)
28062808
else
28072809
{
28082810
authParamsBuilder.WithUserId(ConnectionOptions.UserID);
2809-
fedAuthToken = authProvider.AcquireTokenAsync(authParamsBuilder).Result.ToSqlFedAuthToken();
2811+
fedAuthToken = Task.Run(async () => await authProvider.AcquireTokenAsync(authParamsBuilder)).GetAwaiter().GetResult().ToSqlFedAuthToken();
28102812
_activeDirectoryAuthTimeoutRetryHelper.CachedToken = fedAuthToken;
28112813
}
28122814
break;
@@ -2822,13 +2824,13 @@ internal SqlFedAuthToken GetFedAuthToken(SqlFedAuthInfo fedAuthInfo)
28222824
{
28232825
username = _credential.UserId;
28242826
authParamsBuilder.WithUserId(username).WithPassword(_credential.Password);
2825-
fedAuthToken = authProvider.AcquireTokenAsync(authParamsBuilder).Result.ToSqlFedAuthToken();
2827+
fedAuthToken = Task.Run(async () => await authProvider.AcquireTokenAsync(authParamsBuilder)).GetAwaiter().GetResult().ToSqlFedAuthToken();
28262828
}
28272829
else
28282830
{
28292831
username = ConnectionOptions.UserID;
28302832
authParamsBuilder.WithUserId(username).WithPassword(ConnectionOptions.Password);
2831-
fedAuthToken = authProvider.AcquireTokenAsync(authParamsBuilder).Result.ToSqlFedAuthToken();
2833+
fedAuthToken = Task.Run(async () => await authProvider.AcquireTokenAsync(authParamsBuilder)).GetAwaiter().GetResult().ToSqlFedAuthToken();
28322834
}
28332835
_activeDirectoryAuthTimeoutRetryHelper.CachedToken = fedAuthToken;
28342836
}

src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.Designer.cs

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.de.resx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2563,7 +2563,7 @@
25632563
<value>Fehler beim Authentifizieren des Benutzers "{0}" in Active Directory (Authentication={1}).</value>
25642564
</data>
25652565
<data name="SQL_MSALInnerException" xml:space="preserve">
2566-
<value>Fehlercode 0x{0}; Status {1}</value>
2566+
<value>Fehlercode 0x{0}</value>
25672567
</data>
25682568
<data name="SQL_ChangePasswordRequiresYukon" xml:space="preserve">
25692569
<value>ChangePassword erfordert SQL Server 9.0 oder höher.</value>

src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.es.resx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2563,7 +2563,7 @@
25632563
<value>Error al autenticar el usuario {0} en Active Directory (Authentication={1}).</value>
25642564
</data>
25652565
<data name="SQL_MSALInnerException" xml:space="preserve">
2566-
<value>Código de error 0x{0}; estado{1}</value>
2566+
<value>Código de error 0x{0}</value>
25672567
</data>
25682568
<data name="SQL_ChangePasswordRequiresYukon" xml:space="preserve">
25692569
<value>ChangePassword requiere SQL Server 9.0 o posterior.</value>

src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.fr.resx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2563,7 +2563,7 @@
25632563
<value>Échec de l'authentification de l'utilisateur {0} dans Active Directory (Authentication={1}).</value>
25642564
</data>
25652565
<data name="SQL_MSALInnerException" xml:space="preserve">
2566-
<value>Code d'erreur 0x{0} ; état {1}</value>
2566+
<value>Code d'erreur 0x{0}</value>
25672567
</data>
25682568
<data name="SQL_ChangePasswordRequiresYukon" xml:space="preserve">
25692569
<value>ChangePassword requiert SQL Server 9.0 ou version ultérieure.</value>

src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.it.resx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2563,7 +2563,7 @@
25632563
<value>Non è possibile autenticare l'utente {0} in Active Directory (Authentication={1}).</value>
25642564
</data>
25652565
<data name="SQL_MSALInnerException" xml:space="preserve">
2566-
<value>Codice errore: 0x{0}. Stato: {1}</value>
2566+
<value>Codice errore: 0x{0}</value>
25672567
</data>
25682568
<data name="SQL_ChangePasswordRequiresYukon" xml:space="preserve">
25692569
<value>ChangePassword richiede SQL Server 9.0 o versione successiva.</value>

0 commit comments

Comments
 (0)