Toxicable
Toxicable

Reputation: 1709

Cant authenticate user silently with ADAL for Office 365 REST API on ASP.NET MVC

So I'm trying to implement persistent tokens for our office authentication so that the user does not have to sign into office each time they are in a new session. The code I currently have to authenticating the user is as below.

string authority = "https://login.microsoftonline.com/common";
var tokenCache = new ADALTokenCache(User.Identity.GetUserId());
AuthenticationContext authContext = new AuthenticationContext(authority, tokenCache );
var token = authContext.AcquireTokenSilentAsync(scopes, clientId, new UserIdentifier(userId, UserIdentifierType.RequiredDisplayableId));

But everything I've tried so far gives me the error below enter image description here

The Exception is: "Failed to acquire token silently. Call method AcquireToken"

The method Im using to aquire the token in the first place is as below

string authority = "https://login.microsoftonline.com/common";
var fileCache = new ADALTokenCache(User.Identity.GetUserId());
AuthenticationContext authContext = new AuthenticationContext(authority, fileCache);
var authResult = await authContext.AcquireTokenByAuthorizationCodeAsync(
                authCode, redirectUri, credential, scopes);

And the token cache im using is a db implementation which I made from a tutorial which I cannnot find again, if I watch the db I can see that new tokens are being inserted into the db when AcquireTokenByAuthorizationCodeAsync is called.

Update:
This is my result from authResult when calling AcquireTokenByAuthorizationCodeAsync enter image description here

I have marked Virbonet's answer as the solution but I have not fixed it but he did explain to me where I was going wrong

Upvotes: 1

Views: 2837

Answers (2)

vibronet
vibronet

Reputation: 7394

AcquireTokenSilent cannot work if you are passing /common in the authority. Using "common" is equivalent to declaring that you don' know what tenant is the user from, hence ADAL cannot return a cached token form a specific tenant - user interaction is required to determine which tenant should be used. If you want to call AcquireTokenSilent you need to initialize the authority with the exact tenant of the incoming user, as in "https://login.microsoftonline.com/"+tenantID here tenantID is the tenantID from the current ClaimsPrincipal.

Upvotes: 6

Mostafa
Mostafa

Reputation: 3302

This is the function call you need to use: AcquireTokenByAuthorizationCode() but not AcquireTokenSilent().

Hope this helps.

Upvotes: 0

Related Questions