Skip to content

MSAL.NET 2.x to MSAL.NET 3.x

Jean-Marc Prieur edited this page Mar 26, 2019 · 20 revisions

This page explains how to change the code to move from the MSAL 2.x to MSAL 3.x

IEnumerable<string> scopes = new string[]{"user.read"};
IAccount account;
string authority;
bool forceRefresh = false;

ClientApplicationBase

AcquireTokenSilent

Used to acquire an access token from the user cache, and refresh it if needed

Instead of use
app.AcquireTokenSilentAsync(scopes,
                            account)
app.AcquireTokenSilent(scopes,
                       account)   
   .ExecuteAsync()
   .ConfigureAwait(false);
app.AcquireTokenSilentAsync(scopes,
                            account, 
                            authority,
                            forceRefresh)
app.AcquireTokenSilent(scopes, account)
   .WithAuthority(authority)
   .WithForceRefresh(forceRefresh)    
   .ExecuteAsync()
   .ConfigureAwait(false);

PublicClientApplication

Constructors of PublicClientApplication

Instead of calling the constructor of PublicClientApplication directly, use the PublicClientApplicationBuilder.Create() or the PublicClientApplicationBuilder.CreateWithOptions() methods. The reference documentation page for PublicClientApplicationBuilder shows all the options that you can use.

string clientId;
PublicClientApplicationOptions options;
Instead of use
app=new PublicClientApplication(clientId);
app=PublicClientApplicationBuilder
    .Create(clientId)
    .Build();
app=new PublicClientApplication(clientId,
                                authority);
app=PublicClientApplicationBuilder
   .Create(clientId)
   .WithAuthority(authority)
   .Build();

or

options = new PublicClientApplicationOptions()
{
 ClientId = client,
 Authority = authority
};
app=PublicClientApplicationBuilder
   .CreateWithOptions(options )
   .Build();

Acquire Token interactive

MSAL.NET 2.x had twelve overrides of AcquireTokenAsync

Instead of use
app.AcquireTokenAsync(scopes)
app=AcquireTokenInteractive(scopes, null)
    .ExecuteAsync().
    .ConfigureAwait(false);
app.AcquireTokenAsync(scopes, loginHint)
app=AcquireTokenInteractive(scopes, null)
    .WithLoginHint(loginHint)
    .ExecuteAsync()
    .ConfigureAwait(false);
app.AcquireTokenAsync(scopes, account)
app=AcquireTokenInteractive(scopes, null)
    .WithAccount(account)
    .ExecuteAsync()
    .ConfigureAwait(false);
app.AcquireTokenAsync(scopes,
                      loginHint,
                      uiBehavior,
                      extraQueryParameters)
app=AcquireTokenInteractive(scopes, null)
    .WithLoginHint(account)
    .WithPrompt(prompt)
    .WithExtraQueryParameters(extraQueryParameters)
    .ExecuteAsync()
    .ConfigureAwait(false);
app.AcquireTokenAsync(scopes,
                      loginHint,
                      uiBehavior,
                      extraQueryParameters,
                      extraScopesToConsent,
                      authority)
app=AcquireTokenInteractive(scopes, null)
    .WithLoginHint(loginHint)
    .WithPrompt(prompt)
    .WithExtraQueryParameters(extraQueryParameters)
    .WithExtraSCopesToConsent(extraScopesToConsent)
    .WithAuthority(authority)
    .ExecuteAsync()
    .ConfigureAwait(false);

but of course you only need to specify the parameters that you need

app.AcquireTokenAsync(scopes,
                      account,
                      uiBehavior,
                      extraQueryParameters,
                      extraScopesToConsent,
                      authority)
app=AcquireTokenInteractive(scopes, null)
    .WithAccount(account)
    .WithPrompt(prompt)
    .WithExtraQueryParameters(extraQueryParameters)
    .WithExtraSCopesToConsent(extraScopesToConsent)
    .WithAuthority(authority)
    .ExecuteAsync()
    .ConfigureAwait(false);
app.AcquireTokenAsync(scopes,
                      uiParent)
app=AcquireTokenInteractive(scopes,
                            parentObject)
    .WithUseEmbeddedWebView(useEmbeddedWebView)
    .ExecuteAsync()
    .ConfigureAwait(false);
app.AcquireTokenAsync(scopes, 
                      loginHint,
                      uiParent)
app=AcquireTokenInteractive(scopes,
                            parentObject)
    .WithUseEmbeddedWebView(useEmbeddedWebView)
    .WithLoginHint(loginHint)
    .ExecuteAsync()
    .ConfigureAwait(false);
app.AcquireTokenAsync(scopes,
                      account,
                      uiParent)
app=AcquireTokenInteractive(scopes,
                            parentObject)
    .WithUseEmbeddedWebView(useEmbeddedWebView)
    .WithAccount(account)
    .ExecuteAsync()
    .ConfigureAwait(false);
app.AcquireTokenAsync(scopes,
                      loginHint,
                      uiBehavior,
                      extraQueryParameters,
                      uiParent)
app=AcquireTokenInteractive(scopes,
                            parentObject)
    .WithUseEmbeddedWebView(useEmbeddedWebView)
    .WithLoginHint(account)
    .WithPrompt(prompt)
    .WithExtraQueryParameters(extraQueryParameters)
    .ExecuteAsync()
    .ConfigureAwait(false);
app.AcquireTokenAsync(scopes,
                      loginHint,
                      uiBehavior,
                      extraQueryParameters,
                      extraScopesToConsent,
                      authority,
                      uiParent)
app=AcquireTokenInteractive(scopes,
                            parentObject)
    .WithUseEmbeddedWebView(useEmbeddedWebView)
    .WithLoginHint(loginHint)
    .WithPrompt(prompt)
    .WithExtraQueryParameters(extraQueryParameters)
    .WithExtraSCopesToConsent(extraScopesToConsent)
    .WithAuthority(authority)
    .ExecuteAsync()
    .ConfigureAwait(false);
app.AcquireTokenAsync(scopes,
                      account,
                      uiBehavior,
                      extraQueryParameters,
                      extraScopesToConsent,
                      authority,
                      uiParent)
app=AcquireTokenInteractive(scopes,
                            parentObject)
    .WithUseEmbeddedWebView(useEmbeddedWebView)
    .WithAccount(account)
    .WithPrompt(prompt)
    .WithExtraQueryParameters(extraQueryParameters)
    .WithExtraSCopesToConsent(extraScopesToConsent)
    .WithAuthority(authority)
    .ExecuteAsync()
    .ConfigureAwait(false);

For the list of all the .With operations applicable on AcquireTokenInteractive see AcquireTokenInteractiveParameterBuilder

Acquire Token by username password

Instead of use
app.AcquireTokenByUsernamePasswordAsync(scopes,
                                        username,
                                        securePassword)
app.AcquireTokenByUsernamePassword(scopes,
                                   username,
                                   password)   
   .ExecuteAsync()
   .ConfigureAwait(false);

For the list of all the .With parameters on AcquireTokenByUsernamePassword, see AcquireTokenByUsernamePasswordParameterBuilder

Acquire token with device code flow

Instead of use
app.AcquireTokenWithDeviceCodeAsync(scopes,
                                    deviceCodeResultCallback)
app.AcquireTokenWithDeviceCode(scopes,
                               deviceCodeResultCallback)
   .ExecuteAsync()
   .ConfigureAwait(false);

For the list of all the .With parameters on AcquireTokenWithDeviceCode, see AcquireTokenWithDeviceCodeParameterBuilder

Getting started with MSAL.NET

Acquiring tokens

Desktop/Mobile apps

Web Apps / Web APIs / daemon apps

Advanced topics

News

FAQ

Other resources

Clone this wiki locally