J'ai réussi à configurer une application multi-locataire. Pour l'instant, je suis capable d'authentifier l'utilisateur et d'utiliser des jetons pour accéder à d'autres ressources. (Microsoft Graph & Microsoft AD graphique)Accès B2B dans une application multi-locataires
Maintenant, je veux travailler B2B. flux de courant: - signes utilisateur dans - AuthorizationCodeReceived obtient les acquiert le jeton (via point final $ commonAuthority) - Lorsque vous demandez un jeton pour le graphique Ad, j'utilise le tenantAuthority de $
Cela fonctionne parfaitement quand $ tenantAuthority Toutefois, si je me connecte avec un autre utilisateur (d'un autre locataire, en accordant la confiance au locataire actuel) et que j'utilise $ tenantAuthority = autorité de confiance, alors je suis toujours le même que celui où le compte a été créé.
l'erreur suivante: Echec du jeton d'actualisation: AADSTS65001: L'utilisateur ou l'administrateur n'a pas de compte Pour utiliser l'application avec l'ID
Si je remplace $
Toute aide serait grandement appréciée.
Mise à jour: Code échantillon
App a deux locataires (tenantA en tenantB) et je vais utiliser un utilisateur de tenantB avec tenantA donné une fiducie à cet utilisateur.
AuthorizationCodeReceived = async context =>
{
TenantContext.TenantId = "someguid";
var tenantId =
TenantContext.TenantId;
// get token cache via func, because the userid is only known at runtime
var getTokenCache = container.Resolve<Func<string, TokenCache>>();
var userId = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.ObjectIdentifier).Value;
var tokenCache = getTokenCache(userId);
var authenticationContext = new AuthenticationContext($"{configuration.Authority}",
tokenCache);
await authenticationContext.AcquireTokenByAuthorizationCodeAsync(
context.Code,
new Uri(context.Request.Uri.GetLeftPart(UriPartial.Authority)),
new ClientCredential(configuration.ClientId, configuration.ClientSecret),
configuration.GraphResourceId);
}
Ce code fonctionne parfaitement. Se connecter avec un utilisateur des deux locataires fonctionne parfaitement. Mais quand j'ai besoin du Client de service graphique ou de ActiveDirectoryClient, j'ai besoin d'obtenir des jetons d'accès pour pouvoir adresser une API à un certain locataire. Je récupère les jetons d'accès comme celui-ci:
public IGraphServiceClient CreateGraphServiceClient()
{
var client = new GraphServiceClient(
new DelegateAuthenticationProvider(
async requestMessage =>
{
Logger.Debug("Retrieving authentication token to use in Microsoft Graph.");
string token;
var currentUserHomeTenantId = TenantContext.TenantId;
var currentUserObjectId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.ObjectIdentifier).Value;
var authenticationContext =
new AuthenticationContext($"{_configuration.TenantAuthorityPrefix}{currentUserHomeTenantId}",
_tokenCacheFactoryMethod(currentUserObjectId));
var clientCredential = new ClientCredential(_configuration.ClientId, _configuration.ClientSecret);
try
{
token = await GetTokenSilently(authenticationContext, _configuration.GraphResourceId, currentUserObjectId);
}
catch (AdalSilentTokenAcquisitionException e)
{
Logger.Error("Failed to retrieve authentication token silently, trying to refresh the token.", e);
var result = await authenticationContext.AcquireTokenAsync(_configuration.GraphResourceId, clientCredential);
token = result.AccessToken;
}
requestMessage.Headers.Authorization = new AuthenticationHeaderValue(AuthenticationHeaderKeys.Bearer, token);
}));
return client;
}
public IActiveDirectoryClient CreateAdClient()
{
var currentUserHomeTenantId = TenantContext.TenantId;
var currentUserObjectId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.ObjectIdentifier).Value;
var graphServiceUrl = $"{_configuration.AdGraphResourceId}/{currentUserHomeTenantId}";
var tokenCache = _tokenCacheFactoryMethod(currentUserObjectId);
var client = new ActiveDirectoryClient(new Uri(graphServiceUrl),
() => GetTokenSilently(
new AuthenticationContext(
$"{_configuration.TenantAuthorityPrefix}{ClaimsPrincipal.Current.FindFirst(ClaimTypes.TenantId).Value}", tokenCache
),
_configuration.AdGraphResourceId, currentUserObjectId
));
return client;
}
Quand je fais une demande avec l'un des deux SDK client de, j'obtenu l'erreur suivante: Failed le jeton de rafraîchissement: AADSTS65001: L'utilisateur ou l'administrateur n'a pas consenti à Utilisez l'application avec ID.
Avez-vous vu la page de consentement lors de votre connexion en utilisant les comptes d'un autre locataire? Si non, cela vous dérangerait-il de partager le morceau de code et de vous connecter? –