From 1b9da143e693a2b125d13fb960d3112df94b6b9d Mon Sep 17 00:00:00 2001 From: Cheena Malhotra Date: Thu, 26 Mar 2020 14:21:00 -0700 Subject: [PATCH] [Release 1.1] Allow username with Active Directory Interactive Authentication --- .../ActiveDirectoryNativeAuthenticationProvider.cs | 1 + .../src/Microsoft/Data/SqlClient/SqlConnectionString.cs | 4 ++-- .../netfx/src/Microsoft/Data/SqlClient/SqlUtil.cs | 4 ++-- .../netfx/src/Resources/Strings.Designer.cs | 6 +++--- .../netfx/src/Resources/Strings.resx | 4 ++-- .../ManualTests/SQL/ConnectivityTests/AADConnectionTest.cs | 4 ++-- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/ActiveDirectoryNativeAuthenticationProvider.cs b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/ActiveDirectoryNativeAuthenticationProvider.cs index 645d28e2c2..250a39c173 100644 --- a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/ActiveDirectoryNativeAuthenticationProvider.cs +++ b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/ActiveDirectoryNativeAuthenticationProvider.cs @@ -52,6 +52,7 @@ public override Task AcquireTokenAsync(SqlAuthentication { result = await app.AcquireTokenInteractive(scopes) .WithUseEmbeddedWebView(true) + .WithLoginHint(parameters.UserId) .ExecuteAsync(); } diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlConnectionString.cs b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlConnectionString.cs index 9249f01995..37db14e50a 100644 --- a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlConnectionString.cs +++ b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlConnectionString.cs @@ -530,9 +530,9 @@ internal SqlConnectionString(string connectionString) : base(connectionString, G throw SQL.IntegratedWithUserIDAndPassword(); } - if (Authentication == SqlAuthenticationMethod.ActiveDirectoryInteractive && (HasUserIdKeyword || HasPasswordKeyword)) + if (Authentication == SqlAuthenticationMethod.ActiveDirectoryInteractive && (HasPasswordKeyword)) { - throw SQL.InteractiveWithUserIDAndPassword(); + throw SQL.InteractiveWithPassword(); } #if ADONET_CERT_AUTH diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlUtil.cs b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlUtil.cs index 24ed62d023..0c73601aaf 100644 --- a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlUtil.cs +++ b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlUtil.cs @@ -326,9 +326,9 @@ static internal Exception IntegratedWithUserIDAndPassword() return ADP.Argument(StringsHelper.GetString(Strings.SQL_IntegratedWithUserIDAndPassword)); } - static internal Exception InteractiveWithUserIDAndPassword() + static internal Exception InteractiveWithPassword() { - return ADP.Argument(StringsHelper.GetString(Strings.SQL_InteractiveWithUserIDAndPassword)); + return ADP.Argument(StringsHelper.GetString(Strings.SQL_InteractiveWithPassword)); } static internal Exception SettingIntegratedWithCredential() diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.Designer.cs b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.Designer.cs index 7013e800c6..c8bdc63af2 100644 --- a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.Designer.cs +++ b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.Designer.cs @@ -9370,11 +9370,11 @@ internal static string SQL_IntegratedWithUserIDAndPassword { } /// - /// Looks up a localized string similar to Cannot use 'Authentication=Active Directory Interactive' with 'User ID', 'UID', 'Password' or 'PWD' connection string keywords.. + /// Looks up a localized string similar to Cannot use 'Authentication=Active Directory Interactive' with 'Password' or 'PWD' connection string keywords.. /// - internal static string SQL_InteractiveWithUserIDAndPassword { + internal static string SQL_InteractiveWithPassword { get { - return ResourceManager.GetString("SQL_InteractiveWithUserIDAndPassword", resourceCulture); + return ResourceManager.GetString("SQL_InteractiveWithPassword", resourceCulture); } } diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx index 4d75d55da3..8b427d045c 100644 --- a/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx +++ b/src/Microsoft.Data.SqlClient/netfx/src/Resources/Strings.resx @@ -2496,8 +2496,8 @@ Cannot use 'Authentication=Active Directory Integrated' with 'User ID', 'UID', 'Password' or 'PWD' connection string keywords. - - Cannot use 'Authentication=Active Directory Interactive' with 'User ID', 'UID', 'Password' or 'PWD' connection string keywords. + + Cannot use 'Authentication=Active Directory Interactive' with 'Password' or 'PWD' connection string keywords. Cannot use 'Authentication=Active Directory Integrated', if the Credential property has been set. diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectivityTests/AADConnectionTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectivityTests/AADConnectionTest.cs index 2736848532..cc88b855a5 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectivityTests/AADConnectionTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectivityTests/AADConnectionTest.cs @@ -262,14 +262,14 @@ public static void IntegratedAuthWithCred() [ConditionalFact(nameof(IsAADConnStringsSetup))] [SkipOnTargetFramework(TargetFrameworkMonikers.Netcoreapp)] - public static void MFAAuthWithCred() + public static void MFAAuthWithPassword() { // connection fails with expected error message. string[] AuthKey = { "Authentication" }; string connStr = RemoveKeysInConnStr(DataTestUtility.AADPasswordConnectionString, AuthKey) + "Authentication=Active Directory Interactive;"; ArgumentException e = Assert.Throws(() => ConnectAndDisconnect(connStr)); - string expectedMessage = "Cannot use 'Authentication=Active Directory Interactive' with 'User ID', 'UID', 'Password' or 'PWD' connection string keywords."; + string expectedMessage = "Cannot use 'Authentication=Active Directory Interactive' with 'Password' or 'PWD' connection string keywords."; Assert.Contains(expectedMessage, e.Message); }