diff --git a/doc/samples/AADAuthenticationCustomDeviceFlowCallback.cs b/doc/samples/AADAuthenticationCustomDeviceFlowCallback.cs new file mode 100644 index 0000000000..d225f64ae8 --- /dev/null +++ b/doc/samples/AADAuthenticationCustomDeviceFlowCallback.cs @@ -0,0 +1,30 @@ +// +using System; +using System.Threading.Tasks; +using Microsoft.Identity.Client; +using Microsoft.Data.SqlClient; + +namespace CustomAuthenticationProviderExamples +{ + public class Program + { + public static void Main() + { + SqlAuthenticationProvider authProvider = new ActiveDirectoryAuthenticationProvider(CustomDeviceFlowCallback); + SqlAuthenticationProvider.SetProvider(SqlAuthenticationMethod.ActiveDirectoryDeviceCodeFlow, authProvider); + using (SqlConnection sqlConnection = new SqlConnection("Server=.database.windows.net;Authentication=Active Directory Device Code Flow;Database=;")) + { + sqlConnection.Open(); + Console.WriteLine("Connected successfully!"); + } + } + + private static Task CustomDeviceFlowCallback(DeviceCodeResult result) + { + // Provide custom logic to process result information and read device code. + Console.WriteLine(result.Message); + return Task.FromResult(0); + } + } +} +// diff --git a/doc/samples/ApplicationClientIdAzureAuthenticationProvider.cs b/doc/samples/ApplicationClientIdAzureAuthenticationProvider.cs new file mode 100644 index 0000000000..f206a1c29e --- /dev/null +++ b/doc/samples/ApplicationClientIdAzureAuthenticationProvider.cs @@ -0,0 +1,26 @@ +// +using System; +using Microsoft.Data.SqlClient; + +namespace CustomAuthenticationProviderExamples +{ + public class Program + { + public static void Main() + { + // Supported for all authentication modes supported by ActiveDirectoryAuthenticationProvider + ActiveDirectoryAuthenticationProvider provider = new ActiveDirectoryAuthenticationProvider(""); + if (provider.IsSupported(SqlAuthenticationMethod.ActiveDirectoryInteractive)) + { + SqlAuthenticationProvider.SetProvider(SqlAuthenticationMethod.ActiveDirectoryInteractive, provider); + } + + using (SqlConnection sqlConnection = new SqlConnection("Server=.database.windows.net;Authentication=Active Directory Interactive;Database=;")) + { + sqlConnection.Open(); + Console.WriteLine("Connected successfully!"); + } + } + } +} +// diff --git a/doc/samples/CustomDeviceCodeFlowAzureAuthenticationProvider.cs b/doc/samples/CustomDeviceCodeFlowAzureAuthenticationProvider.cs new file mode 100644 index 0000000000..e71c9af8d1 --- /dev/null +++ b/doc/samples/CustomDeviceCodeFlowAzureAuthenticationProvider.cs @@ -0,0 +1,57 @@ +// +using System; +using System.Threading.Tasks; +using Microsoft.Identity.Client; +using Microsoft.Data.SqlClient; + +namespace CustomAuthenticationProviderExamples +{ + /// + /// Example demonstrating creating a custom device code flow authentication provider and attaching it to the driver. + /// This is helpful for applications that wish to override the Callback for the Device Code Result implemented by the SqlClient driver. + /// + public class CustomDeviceCodeFlowAzureAuthenticationProvider : SqlAuthenticationProvider + { + public override async Task AcquireTokenAsync(SqlAuthenticationParameters parameters) + { + string clientId = "my-client-id"; + string clientName = "My Application Name"; + string s_defaultScopeSuffix = "/.default"; + + string[] scopes = new string[] { parameters.Resource.EndsWith(s_defaultScopeSuffix) ? parameters.Resource : parameters.Resource + s_defaultScopeSuffix }; + + IPublicClientApplication app = PublicClientApplicationBuilder.Create(clientId) + .WithAuthority(parameters.Authority) + .WithClientName(clientName) + .WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient") + .Build(); + + AuthenticationResult result = await app.AcquireTokenWithDeviceCode(scopes, + deviceCodeResult => CustomDeviceFlowCallback(deviceCodeResult)).ExecuteAsync(); + return new SqlAuthenticationToken(result.AccessToken, result.ExpiresOn); + } + + public override bool IsSupported(SqlAuthenticationMethod authenticationMethod) => authenticationMethod.Equals(SqlAuthenticationMethod.ActiveDirectoryDeviceCodeFlow); + + private Task CustomDeviceFlowCallback(DeviceCodeResult result) + { + Console.WriteLine(result.Message); + return Task.FromResult(0); + } + } + + public class Program + { + public static void Main() + { + // Register our custom authentication provider class to override Active Directory Device Code Flow + SqlAuthenticationProvider.SetProvider(SqlAuthenticationMethod.ActiveDirectoryDeviceCodeFlow, new CustomDeviceCodeFlowAzureAuthenticationProvider()); + using (SqlConnection sqlConnection = new SqlConnection("Server=.database.windows.net;Authentication=Active Directory Device Code Flow;Database=;")) + { + sqlConnection.Open(); + Console.WriteLine("Connected successfully!"); + } + } + } +} +//