Blog Post

Core Infrastructure and Security Blog
6 MIN READ

Using Entra ID Authentication with Arc-Enabled SQL Server in a .NET Windows Forms Application

jpigott's avatar
jpigott
Icon for Microsoft rankMicrosoft
Aug 15, 2025

Introduction: 

This guide demonstrates how to securely connect a .NET Framework Windows Forms application to an Arc-enabled SQL Server 2022 instance using Entra ID (Azure AD) authentication. It covers user authentication, token management, and secure connection practices, with code samples and screenshots.

In many modern applications, it is common practice to use an application web service to mediate access to SQL Server. This approach can offer several advantages, such as improved security, scalability, and centralized management of database connections. However, there are scenarios where directly connecting to SQL Server is more appropriate. This guide focuses on such scenarios, providing a solution for applications that need direct access to SQL Server.


This model is particularly useful for applications like SQL Server Management Studio (SSMS), which require direct database connections to perform their functions. By using Entra ID authentication, we can ensure that these direct connections are secure and that user credentials are managed efficiently.
By following the steps outlined in this guide, developers can ensure secure and efficient connections between their .NET Windows Forms applications and Arc-enabled SQL Server instances using Entra ID authentication. This approach not only enhances security but also simplifies the management of user credentials and access tokens, providing a robust solution for modern application development.

 

SAMPLE CODE:  GitHub Repository

Prerequisites

  • Arc-enabled SQL Server 2022/2025 configured for Entra ID authentication
  • Entra ID (Azure AD) tenant and app registration
  • .NET Framework 4.6.2 Windows Forms application (Not required .NET version, only what the solution is based on)
  • Microsoft.Identity.Client, Microsoft.Data.SqlClient NuGet packages

Application Overview

  • User authenticates with Entra ID
  • Token is acquired and used to connect to SQL Server
  • Option to persist token cache or keep it in memory
  • Data is retrieved and displayed in a DataGridView
  • Similar setup to use SSMS with Entra ID in articles below.

Windows Form Sample

 

 

Check User Button shows the current user

 

 

 

The Connect to Entra ID at Login button will verify if you are logged in and try to connect to SQL Server.

 

 

If the user is not logged in, an Entra ID authentication window will be displayed or ask you to log in.

 

Once logged in it shows a Connection successful message box stating the connection to the database was completed.

 

 

The Load Data button queries the Adventure Works database Person table and loads the names into the datagridview.

 

 

 

 

 

 

The Cache Token to Disk checkbox option either caches to memory when unchecked and would require reauthentication after the application closes, or the option to cache to disk the token to be read on future application usage.

If the file is cached to disk, the location of the cached file is (C:\Users\[useraccount]\AppData\Local).  This sample does not encrypt the file which is something that would be recommended for production use.

 

 

 

This code uses MSAL (Microsoft Authentication Library) to authenticate users in a .NET application using their Microsoft Entra ID (Azure AD) credentials. It configures the app with its client ID, tenant ID, redirect URI, and logging settings to enable secure token-based authentication.

        //Application registration ClientID, and TenantID are required for MSAL authentication

        private static IPublicClientApplication app = PublicClientApplicationBuilder.Create("YourApplicationClientID")

            .WithAuthority(AzureCloudInstance.AzurePublic, "YourTenantID")

            .WithRedirectUri("http://localhost")

            .WithLogging((level, message, containsPii) => Debug.WriteLine($"MSAL: {message}"), LogLevel.Verbose, true, true)

            .Build();

 

This method handles user login by either enabling persistent token caching or setting up temporary in-memory caching, depending on the input. It then attempts to silently acquire an access token for Azure SQL Database using cached credentials, falling back to interactive login if no account is found.

private async Task<AuthenticationResult> LoginAsync(bool persistCache)

{

    if (persistCache)

        TokenCacheHelper.EnablePersistence(app.UserTokenCache);

    else

    {

        app.UserTokenCache.SetBeforeAccess(args => { });

        app.UserTokenCache.SetAfterAccess(args => { });

    }

    string[] scopes = new[] { "https://database.windows.net//.default" };

    var accounts = await app.GetAccountsAsync();

    if (accounts == null || !accounts.Any())

        return await app.AcquireTokenInteractive(scopes).ExecuteAsync();

    var account = accounts.FirstOrDefault();

    return await app.AcquireTokenSilent(scopes, account).ExecuteAsync();

}

Connecting to SQL Server with Access Token

This code connects to an Azure SQL Database using a connection string and an access token obtained through MSAL authentication. It securely opens the database connection by assigning the token to the SqlConnection object, enabling authenticated access without storing credentials in the connection string.

This sample uses a self-signed certificate, in production always configure SQL Server protocols with a certificate issued by a trusted Certificate Authority (CA). 

  • TrustServerCertificate=True bypasses certificate validation and can allow MITM attacks. 

string connectionString = $"Server={txtSqlServer.Text};Database=AdventureWorks2019;Encrypt=True;TrustServerCertificate=True;";

var result = await LoginAsync(checkBox1.Checked);

using (var conn = new SqlConnection(connectionString))

{

    conn.AccessToken = result.AccessToken;

    conn.Open();

    // ... use connection ...

}

Fetching Data into DataGridView

This method authenticates the user and connects to an Azure SQL Database using an access token, and runs a SQL query to retrieve the top 1,000 names from the Person table. It loads the results into a DataTable, which can then be used for display or further processing in the application.

private async Task<DataTable> FetchDataAsync()

{

    var dataTable = new DataTable();

    var result = await LoginAsync(checkBox1.Checked);

 

    using (var conn = new SqlConnection(connectionString))

    {

        conn.AccessToken = result.AccessToken;

        await conn.OpenAsync();

        using (var cmd = new SqlCommand("SELECT TOP (1000) [FirstName], [MiddleName], [LastName] FROM [AdventureWorks2019].[Person].[Person]", conn))

        using (var reader = await cmd.ExecuteReaderAsync())

        {

            dataTable.Load(reader);

        }

    }

    return dataTable;

}

Configure Azure Arc SQL Server to use Entra ID authentication

Using SQL Server 2022 follow the instructions here to setup the key vault and certificate when configuring.

This article can also be used to configure SSMS to use Entra ID authentication. Detailed steps located here: Set up Microsoft Entra authentication for SQL Server - SQL Server | Microsoft Learn

 

 

Using SQL Server 2025 the setup is much easier as you do not need to configure a Key Vault, or certificates as it is relying on using the managed identity for the authentication.

 

 

Entra ID App Registration Steps

On the Entra ID app registration, click on API Permissions.

Add the API’s for Microsoft Graph:

  • User.Read.All
  • Application.Read.All
  • Group.Read.All

 

Add a permission for Azure SQL Database. If Azure SQL database is not shown in the list ensure that the Resource Provider is registered for Microsoft.Sql.

 

 

 

Choose Delegated permissions and select user_impersonation, Click Add permission for the Azure SQL Database.

 

 

 

 

 

NOTE: Once the permissions are added ensure that you grant admin consent on the items.

 

Security Considerations

  • Never store client secrets in client apps
  • Use in-memory token cache for higher security, or encrypted disk cache for convenience
  • Use user tokens for auditing and least privilege

References

 

Conclusion: 

By following the steps outlined in this guide, developers can ensure secure and efficient connections between their .NET Windows Forms applications and Arc-enabled SQL Server instances using Entra ID authentication. This approach not only enhances security but also simplifies the management of user credentials and access tokens, providing a robust solution for modern application development.

 

*** Disclaimer *** 

The sample scripts are not supported under any Microsoft standard support program or service. The sample scripts are provided AS IS without warranty of any kind. Microsoft further disclaims all implied warranties including, without limitation, any implied warranties of merchantability or of fitness for a particular purpose. The entire risk arising out of the use or performance of the sample scripts and documentation remains with you. In no event shall Microsoft, its authors, or anyone else involved in the creation, production, or delivery of the scripts be liable for any damages whatsoever (including, without limitation, damages for loss of business profits, business interruption, loss of business information, or other pecuniary loss) arising out of the use of or inability to use

 

Updated Aug 15, 2025
Version 2.0
No CommentsBe the first to comment