Authentifier les utilisateurs d’Office 365 avec les services web Customer Engagement

Cela s’applique aux clients qui accèdent à Dynamics 365 Customer Engagement (on-premises) pour applications par le biais de l’environnement Microsoft Online Services. Il existe plusieurs fournisseurs d’identité Dynamics 365 Customer Engagement (on-premises) qui doivent être pris en compte lorsque vous développez une application qui se connecte aux services web d’organisation ou de découverte. Ces fournisseurs peuvent être identifiés domaine géré, fédérés et compte Microsoft. Cette rubrique se concentre sur l’authentification du service web Dynamics 365 Customer Engagement (on-premises) avec le domaine géré et les fournisseurs d’identité fédérés, bien que les mêmes classes et le code présentés ici fonctionnent également avec les fournisseurs d’identité et les types de déploiement Dynamics 365 Customer Engagement (on-premises) pris en charge.

Utiliser les classes d’authentification simplifiées

Vous pouvez utiliser les classes OrganizationServiceProxy et DiscoveryServiceProxy lors de l’authentification avec les services web.
Pour plus d’informations sur l’utilisation de ces classes de proxy, voir Authentification via des classes proxy clientes.

Note

L’exemple de code d’assistance contenant la classe ServerConnection n’est plus maintenue et sera supprimée dans le futur. À la place, utilisez l’une des API d’authentification prises en charge dans les assemblys SDK tels que CrmServiceClient.

Une autre méthode d’authentification consiste à utiliser le code source d’assistance fourni dans le Kit de développement logiciel. La classe d’assistance ServerConnection, indiquée dans Code d’assistance : classe ServerConnection, fournit les méthodes GetOrganizationProxy et GetProxy pour l’authentification. Si vous affichez le code source pour ServerConnection, vous verrez que GetOrganizationProxy appelle en réalité GetProxy.

using ( OrganizationServiceProxy orgServiceProxy = ServerConnection.GetOrganizationProxy(serverConfig) ) { }  

Vous devez créer ces objets proxy d’organisation ou de service de découverte dans une instruction using pour disposer correctement du proxy du service, ou vous devez appeler Dispose directement. Pour obtenir un exemple de code qui utilise la méthode de code d’assistance GetOrganizationProxy, voir Exemple : démarrage rapide.

La liste complète des classes d’authentification disponibles dans les assemblys du SDK se trouve dans la section Classes d’authentification.

Authentifier les utilisateurs de compte Microsoft avec Office 365

Votre application doit prendre en charge ces utilisateurs Dynamics 365 Customer Engagement (on-premises) dont l’organisation est transférée du fournisseur d’identité de compte Microsoft au fournisseur d’identité Microsoft Online Services. Dans ce scénario, les utilisateurs peuvent fournir les informations d’ouverture de session de compte Microsoft lors de l’authentification avec le fournisseur d’identité Microsoft Online Services de Dynamics 365 Customer Engagement (on-premises).

Pour cela, passez les informations d’identification renseignées dans le constructeur OrganizationServiceProxy ou la méthode AuthenticationCredentials de la classe IServiceManagement. Les valeurs d’informations d’identification sont renseignées comme suit :

AuthenticationCredentials.ClientCredentials = <Microsoft account sign-in credentials>  
AuthenticationCredentials.SupportingCredentials.ClientCredentials = <device credentials>  

Si votre code vérifie le type de fournisseur d’identité pour déterminer comment effectuer l’authentification, du code supplémentaire sera nécessaire. Consultez la méthode GetCredentials dans la section suivante pour obtenir des exemples de code qui prennent en charge les utilisateurs de compte Microsoft transférés.

Pour plus d’informations sur cette transition, voir Intégration de Dynamics 365 Customer Engagement (on-premises) avec Office 365.

Authentification approfondie

La discussion précédente a présenté deux approches simples pouvant être utilisées pour l’authentification d’un utilisateur avec les services web Dynamics 365 Customer Engagement (on-premises). Les informations suivantes montrent comment authentifier un utilisateur via la classe IServiceManagement<TService> et incluent le code source à la méthode GetProxy. Pour voir l’exemple complet qui contient les exemples suivants, voir Exemple : authentifier les utilisateurs d’Office 365. Vous remarquerez que l’authentification prend à ce niveau beaucoup plus de code.

L’exemple de code suivant illustre les classes et les méthodes que vous pouvez utiliser dans votre application pour authentifier un utilisateur Office 365/MOS avec les services web de Dynamics 365 Customer Engagement (on-premises).



IServiceManagement<IOrganizationService> orgServiceManagement =
    ServiceConfigurationFactory.CreateManagement<IOrganizationService>(
    new Uri(organizationUri));

// Set the credentials.
AuthenticationCredentials credentials = GetCredentials(orgServiceManagement, endpointType);

// Get the organization service proxy.
using (OrganizationServiceProxy organizationProxy =
    GetProxy<IOrganizationService, OrganizationServiceProxy>(orgServiceManagement, credentials))
{
    // This statement is required to enable early-bound type support.
    organizationProxy.EnableProxyTypes();

    // Now make an SDK call with the organization service proxy.
    // Display information about the logged on user.
    Guid userid = ((WhoAmIResponse)organizationProxy.Execute(
        new WhoAmIRequest())).UserId;
    SystemUser systemUser = organizationProxy.Retrieve("systemuser", userid,
        new ColumnSet(new string[] { "firstname", "lastname" })).ToEntity<SystemUser>();
    Console.WriteLine("Logged on user is {0} {1}.",
        systemUser.FirstName, systemUser.LastName);
}

Le code crée un objet IServiceManagement<TService> pour le service d’organisation. Un objet de type AuthenticationCredentials est utilisé pour contenir les informations d’identification de l’ouverture de session de l’utilisateur. Les informations d’identification d’objet et utilisateur IServiceManagement sont ensuite passées à GetProxy pour obtenir la référence du proxy du service web.



/// <summary>
/// Obtain the AuthenticationCredentials based on AuthenticationProviderType.
/// </summary>
/// <param name="service">A service management object.</param>
/// <param name="endpointType">An AuthenticationProviderType of the CRM environment.</param>
/// <returns>Get filled credentials.</returns>
private AuthenticationCredentials GetCredentials<TService>(IServiceManagement<TService> service, AuthenticationProviderType endpointType)
{
    AuthenticationCredentials authCredentials = new AuthenticationCredentials();

    switch (endpointType)
    {
        case AuthenticationProviderType.ActiveDirectory:
            authCredentials.ClientCredentials.Windows.ClientCredential =
                new System.Net.NetworkCredential(_userName,
                    _password,
                    _domain);
            break;
        case AuthenticationProviderType.LiveId:
            authCredentials.ClientCredentials.UserName.UserName = _userName;
            authCredentials.ClientCredentials.UserName.Password = _password;
            authCredentials.SupportingCredentials = new AuthenticationCredentials();
            authCredentials.SupportingCredentials.ClientCredentials =
                Microsoft.Crm.Services.Utility.DeviceIdManager.LoadOrRegisterDevice();
            break;
        default: // For Federated and OnlineFederated environments.                    
            authCredentials.ClientCredentials.UserName.UserName = _userName;
            authCredentials.ClientCredentials.UserName.Password = _password;
            // For OnlineFederated single-sign on, you could just use current UserPrincipalName instead of passing user name and password.
            // authCredentials.UserPrincipalName = UserPrincipal.Current.UserPrincipalName;  // Windows Kerberos

            // The service is configured for User Id authentication, but the user might provide Microsoft
            // account credentials. If so, the supporting credentials must contain the device credentials.
            if (endpointType == AuthenticationProviderType.OnlineFederation)
            {
                IdentityProvider provider = service.GetIdentityProvider(authCredentials.ClientCredentials.UserName.UserName);
                if (provider != null && provider.IdentityProviderType == IdentityProviderType.LiveId)
                {
                    authCredentials.SupportingCredentials = new AuthenticationCredentials();
                    authCredentials.SupportingCredentials.ClientCredentials =
                        Microsoft.Crm.Services.Utility.DeviceIdManager.LoadOrRegisterDevice();
                }
            }

            break;
    }

    return authCredentials;
}

L’objet AuthenticationCredentials est configuré en fonction de l’identité abonnée pour l’utilisateur connecté. Notez que les informations d’identification pour tous les types de fournisseurs d’identité sont affichées. L’incident par défaut gère le domaine géré Office 365/MOS, les utilisateurs en ligne dont les identités sont fédérées dans le cloud, et les utilisateurs de compte Microsoft transférés. Maintenant regardons ce que GetProxy effectue réellement.



private TProxy GetProxy<TService, TProxy>(
    IServiceManagement<TService> serviceManagement,
    AuthenticationCredentials authCredentials)
    where TService : class
    where TProxy : ServiceProxy<TService>
{
    Type classType = typeof(TProxy);

    if (serviceManagement.AuthenticationType !=
        AuthenticationProviderType.ActiveDirectory)
    {
        AuthenticationCredentials tokenCredentials =
            serviceManagement.Authenticate(authCredentials);
        // Obtain discovery/organization service proxy for Federated, LiveId and OnlineFederated environments. 
        // Instantiate a new class of type using the 2 parameter constructor of type IServiceManagement and SecurityTokenResponse.
        return (TProxy)classType
            .GetConstructor(new Type[] { typeof(IServiceManagement<TService>), typeof(SecurityTokenResponse) })
            .Invoke(new object[] { serviceManagement, tokenCredentials.SecurityTokenResponse });
    }

    // Obtain discovery/organization service proxy for ActiveDirectory environment.
    // Instantiate a new class of type using the 2 parameter constructor of type IServiceManagement and ClientCredentials.
    return (TProxy)classType
        .GetConstructor(new Type[] { typeof(IServiceManagement<TService>), typeof(ClientCredentials) })
        .Invoke(new object[] { serviceManagement, authCredentials.ClientCredentials });
}

 

Pour tous les déploiements différents des locaux (Active Directory, sans revendications), la méthode Authenticate(AuthenticationCredentials) est appelée, puis le proxy du service est instancié. Notez que les informations d’authentification retournées de Authenticate contient la réponse de jeton de sécurité utilisée dans le constructeur du proxy de service. La méthode GetProxy générique indiquée précédemment peut être utilisée pour obtenir une référence d’objet à OrganizationServiceProxy ou DiscoveryServiceProxy.

Voir aussi

Se connecter avec Microsoft Office 365 et Dynamics 365 Customer Engagement (on-premises)Exemple : authentifier les utilisateurs d’Office 365
Code d’assistance : classe ServerConnection
Authentification Active Directory et basée sur les revendications
Utiliser les chaînes de connexion des outils XRM pour se connecter à Dynamics 365 Customer Engagement (on-premises)