-
Notifications
You must be signed in to change notification settings - Fork 366
Synchronous Programming
It is strongly recommended to use async programming practices for better performance and responsive apps. However, some legacy apps cannot use asynchronous programming.
MSAL.NET is based on Task-based Asynchronous Pattern (TAP). This page provides links to guidance about how to use async methods in a synchronous way. This has no one solution that fits all. So various best practices are recommended.
If you are not familiar with asynchronous programming, this article will get you familiarized with it: Asynchronous programming with async and await.
You can check for courses on LinkedIn: Advanced Programming in C#.
There are several ways to run asynchronous code from a synchronous code. Various links are listed here.
var getAcctsTasks = PCA.RemoveAsync(acct);
// there is no timeout for RunSynchronously
if (!getAcctsTasks.IsCompleted)
{
getAcctsTasks.RunSynchronously();
}
Wait for a task to complete with Task.Wait
// wait can optionally have timeout, and cancellation token (not shown)
int timeoutMilliSec = 3000;
PCA.RemoveAsync(acct).Wait(timeoutMilliSec);
Wait to get result with Task.Result
var authResult = PCA.AcquireTokenSilent(Scopes, acct).ExecuteAsync().Result;
return authResult;
If you need to run multiple tasks at a time prior to wrapping them, it may be useful to take a look at Consuming the Task-based Asynchronous Pattern.
Here is how to catch exceptions and prevent deadlocks with .ConfigureAwait(false)
.
try
{
Console.WriteLine("Pre AcquireTokenInteractive");
// Run with wait command
// create the builder
var builder = PCA.AcquireTokenInteractive(Scopes);
// run it interactively.
// make sure to have ConfigureAwait(false) to avoid any potential deadlocks
var authResult = builder.ExecuteAsync()
.ConfigureAwait(false)
.GetAwaiter()
.GetResult();
Console.WriteLine("Post AcquireTokenInteractive - Got the token");
return result;
}
catch (MsalClientException ex)
{
// catch MSAL exception
Console.WriteLine(ex.Message);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
- Home
- Why use MSAL.NET
- Is MSAL.NET right for me
- Scenarios
- Register your app with AAD
- Client applications
- Acquiring tokens
- MSAL samples
- Known Issues
- Acquiring a token for the app
- Acquiring a token on behalf of a user in Web APIs
- Acquiring a token by authorization code in Web Apps
- AcquireTokenInteractive
- WAM - the Windows broker
- .NET Core
- Maui Docs
- Custom Browser
- Applying an AAD B2C policy
- Integrated Windows Authentication for domain or AAD joined machines
- Username / Password
- Device Code Flow for devices without a Web browser
- ADFS support
- High Availability
- Regional
- Token cache serialization
- Logging
- Exceptions in MSAL
- Provide your own Httpclient and proxy
- Extensibility Points
- Clearing the cache
- Client Credentials Multi-Tenant guidance
- Performance perspectives
- Differences between ADAL.NET and MSAL.NET Apps
- PowerShell support
- Testing apps that use MSAL
- Experimental Features
- Proof of Possession (PoP) tokens
- Using in Azure functions
- Extract info from WWW-Authenticate headers
- SPA Authorization Code