2015-08-24 5 views
6

Ho utilizzato la mia Azure Active Directory per proteggere la mia API Web e ho creato un'applicazione nativa nel portale di gestione di Azure. Questa applicazione nativa è fondamentalmente un'applicazione web MVC e io uso la libreria ADAL per ottenere il token e chiamare l'API con quel token. Il codice che ho usato per ottenere il token è la seguente:Logout di Azure Active Directory con libreria ADAL

AuthenticationContext ac = new AuthenticationContext(authority); 
AuthenticationResult ar = ac.AcquireToken(resourceID, clientID, redirectURI); 
string accessToken = ar.AccessToken; 

ora ho bisogno di logout e passare a un altro utente, ma in qualche modo le credenziali dell'utente vengono ricordati dal sistema. Svuoto la cache dei token nel contesto dell'autenticazione e nella richiesta di logout post logout come segue dove *** è il mio ID tenant.

//Log out after api call 
ac.TokenCache.Clear(); 

string requestUrl = "https://login.windows.net/***/oauth2/logout"; 

var client = new HttpClient(); 
var request = new HttpRequestMessage(HttpMethod.Get, requestUrl); 
var response = await client.SendAsync(request); 

La chiamata api ha esito positivo ma il logout non funziona. Cosa devo fare per disconnettermi e passare a un altro utente?

risposta

8

Non penso che funzioni. Dovresti reindirizzare l'utente all'URL di logout affinché il logout funzioni.

Ecco come è possibile creare un URI di logout:

https://login.microsoftonline.com/{0}/oauth2/logout?post_logout_redirect_uri={1}

Dove:

  • {0} - nome completo del Azure Active Directory per esempio yourad.onmicrosoft.com o id titolare.
  • {1} - L'URL dell'applicazione in cui è necessario reindirizzare un utente al termine del logout. Questo dovrebbe essere correttamente codificato URL.
+0

Questo è esattamente quello che voglio, grazie! –

+0

Ho provato a chiamare questo logout in ADAL iOS, ma non è sufficiente per impedire un'eccezione in caso di modifica di un account. Qualcuno ha avuto successo nel login/logout usando ADALiOS e due account diversi? –

1

Se l'obiettivo è di accedere a un diverso utente, non è strettamente necessario disconnettere il primo utente dalla sua sessione con Azure AD. Puoi passare PrompBehavior. Sempre nella tua chiamata a AcquireToken, in modo che ti sia garantito di richiedere all'utente una UX di raccolta delle credenziali pulita. Nota: se si desidera cancellare ogni traccia del primo utente dall'app, è possibile mantenere il codice di pulizia della cache disponibile. ADAL ti consente di mantenere token per più utenti, quindi se la tua app come funzione multi-utente potrebbe essere utile, il problema è che se lo fai, ad ogni AcquireToken dovrai specificare anche quale utente desideri un token per o ADAL non saprà quale tornare. Se non hai bisogno di più utenti contemporaneamente, la pulizia della cache + PromptBehavior.Aways rimane il percorso più semplice.

+0

Potresti confermare che questo funziona attualmente? Io uso la libreria iOS ADAL, con la richiesta AD_PROMPT_ALWAYS. Non riesco ad accedere con nessun altro utente al primo utente con cui ho eseguito il test: (Errore ADAL: 19, Utente diverso è stato autenticato. Stato: 2). http://stackoverflow.com/questions/32312710/adal-for-ios-exception-with-a-different-user-sign-on –

1

È possibile farlo per la cache chiaro:

 CookieManager cookieManager = CookieManager.getInstance(); 
     cookieManager.removeAllCookie(); 
     CookieSyncManager.getInstance().sync(); 
     mAuthContext.getCache().removeAll(); 
+0

Questa è una parte della soluzione, hanno cambiato l'ultima parte della rimozione dei token da la cache: 'mAuthContext.getCache(). clear();' Ma questa soluzione funziona davvero! – Vladimir