CommunityToolkit / CommunityToolkit/Graph-Controls

MsalProvider not handling token expiration properly

Aperta
#189 3 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Area: Providers bug :bug:
Lingua principale
C#
Stelle
156
Fork
38
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

## Describe the bug

My app periodically check for files in OneDrive and i've notices that if the app is kept opened long enough, the token will expire and the user will be prompt to select an account again.

I've manage to work around this issue by creating my own MsalProvider and changing the GetTokenWithScopesAsync as follows:

```csharp
protected async Task GetTokenWithScopesAsync(string[] scopes, bool silentOnly = false)
{
await SemaphoreSlim.WaitAsync();

try
{
AuthenticationResult authResult = null;
try
{
var account = Account ?? (await Client.GetAccountsAsync()).FirstOrDefault();
if (account != null)
{
authResult = await Client.AcquireTokenSilent(scopes, account).ExecuteAsync();
}
}
catch (MsalUiRequiredException)
{
// CODE ADDED TO WORK AROUND THE EXPIRATION TOKEN ISSUE
if (Account != null)
{
Account = null;
SemaphoreSlim.Release();
return await GetTokenWithScopesAsync(scopes, silentOnly);
}
}
catch
{
// Unexpected exception
// TODO: Send exception to a logger.
}

if (authResult == null && !silentOnly)
{
try
{
var paramBuilder = Client.AcquireTokenInteractive(scopes);

if (Account != null)
{
paramBuilder = paramBuilder.WithAccount(Account);
}
paramBuilder = paramBuilder.WithPrompt(Microsoft.Identity.Client.Prompt.NoPrompt);

authResult = await paramBuilder.ExecuteAsync();
}
catch
{
// Unexpected exception
// TODO: Send exception to a logger.
}
}

Account = authResult?.Account;

return authResult?.AccessToken;
}
finally
{
SemaphoreSlim.Release();
}
}
```

I'm not submitting this as a PR cause i think that this is not the best way to handle this issue.

## Steps to Reproduce
Steps to reproduce the behavior:
1. Open an app and make a request so that a token is generated
2. Keep the app open until the token expires
3. Try to make another request
4. The app will prompt you to select an account again.

## Expected behavior
I believe that once the user has authenticated the account selection window should not be prompt again.

## Environment
```
Package Version(s): 7.1.1

Windows 11 Build Number:
- [x] Windows 11 (22000)

App min and target version:
- [ ] Fall Creators Update (16299)
- [ ] April 2018 Update (17134)
- [ ] October 2018 Update (17763)
- [x] May 2019 Update (18362)
- [x] Windows 11 (Build 22000)

Device form factor:
- [x] Desktop
- [ ] Xbox
- [ ] Surface Hub
- [ ] IoT

Visual Studio
- [ ] 2017 (version: )
- [ ] 2019 (version: )
- [ ] 2019 Preview (version: )
- [x] 2022

```

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Direzione di ricerca

Inizia con MsalProvider e il relativo metodo GetTokenWithScopesAsync, quindi segui il flusso di acquisizione del token descritto nei passaggi per la riproduzione. Riproduci una richiesta dopo la scadenza del token e verifica che venga riutilizzato un account già autenticato senza richiedere la selezione di un account.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
csharp
Ambito
authentication
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.