Authentifier les utilisateurs d'Office 365 avec des services Web Microsoft Dynamics CRM Online

 

Date de publication : novembre 2016

S’applique à : Dynamics CRM 2015

Cette rubrique s’applique aux clients qui accèdent à Microsoft Dynamics CRM Online via l’ Environnement Microsoft Online Services. Il existe plusieurs fournisseurs d’identité Microsoft Dynamics CRM Online 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 Microsoft Dynamics CRM Online 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 Microsoft Dynamics 365 pris en charge.

Contenu de la rubrique

Utiliser les classes d’authentification simplifiées

Authentifier les utilisateurs de compte Microsoft avec Office 365

Authentification approfondie

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.

Une autre méthode d’authentification utilise la classe CrmConnection. En quelques lignes de code, votre application peut s’authentifier avec les services Web et commencer à appeler les méthodes Web. Pour plus d’informations sur la classe CrmConnection, voir Connexion simplifiée à Microsoft Dynamics CRM 2015. Un exemple de code est disponible dans la rubrique Exemple : démarrage rapide de la connexion simplifiée avec Microsoft Dynamics CRM.

CrmConnection connection = CrmConnection.Parse (connectionString);
using ( OrganizationService orgService = new OrganizationService(connection)) { }

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 la rubrique 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 de Microsoft Dynamics CRM.

La liste complète des classes d’authentification disponibles dans SDK Microsoft Dynamics CRM est indiquée dans la section Classes d’authentification.

Authentifier les utilisateurs de compte Microsoft avec Office 365

Votre application doit prendre en charge ces utilisateurs Microsoft Dynamics CRM Online dont l’organisation est transférée du fournisseur d’identité Compte Microsoft au fournisseur d’identité Microsoft Online Services. Dans ce scénario, les utilisateurs peuvent fournir les informations d’ouverture de session Compte Microsoft lors de l’authentification avec le fournisseur d’identité Microsoft Online Services de Microsoft Dynamics CRM Online.

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

AuthenticationCredentials.ClientCredentials = <Microsoft account logon credentials>
AuthenticationCredentials.SupportingCredentials.ClientCredentials = <device credentials>

Vous pouvez obtenir les informations d’identification du périphérique en utilisant l’une des méthodes publiques, par exemple LoadOrRegister, dans le code d’assistance DeviceIdManager. Pour plus d'informations, voir Code d’assistance : classe DeviceIdManager.

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 Compte Microsoft transférés.

Pour plus d’informations sur ce transfert, voir Intégration de Microsoft Dynamics CRM Online à 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 Microsoft Dynamics 365. 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 avec des services Web Microsoft Dynamics CRM. 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 Microsoft Dynamics CRM Online.


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);
}

Dim orgServiceManagement As IServiceManagement(Of IOrganizationService) =
    ServiceConfigurationFactory.CreateManagement(Of IOrganizationService)(New Uri(organizationUri))

' Set the credentials.
Dim credentials As AuthenticationCredentials = GetCredentials(endpointType_renamed)

' Get the organization service proxy.
Using organizationProxy As OrganizationServiceProxy =
    GetProxy(Of 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.
    Dim userid As Guid = (CType(organizationProxy.Execute(New WhoAmIRequest()), 
                          WhoAmIResponse)).UserId
    Dim systemUser_renamed As SystemUser =
        organizationProxy.Retrieve("systemuser",
                                   userid,
                                   New ColumnSet(New String() {"firstname",
                                                               "lastname"})).ToEntity(Of SystemUser)()
    Console.WriteLine("Logged on user is {0} {1}.",
                      systemUser_renamed.FirstName, systemUser_renamed.LastName)
End Using

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 &amp;&amp; provider.IdentityProviderType == IdentityProviderType.LiveId)
                {
                    authCredentials.SupportingCredentials = new AuthenticationCredentials();
                    authCredentials.SupportingCredentials.ClientCredentials =
                        Microsoft.Crm.Services.Utility.DeviceIdManager.LoadOrRegisterDevice();
                }
            }

            break;
    }

    return authCredentials;
}

''' <summary>
''' Obtain the AuthenticationCredentials based on AuthenticationProviderType.
''' </summary>
''' <param name="endpointType">An AuthenticationProviderType of the CRM environment.</param>
''' <returns>Get filled credentials.</returns>
Private Function GetCredentials(ByVal endpointType As AuthenticationProviderType) As AuthenticationCredentials

    Dim authCredentials As New AuthenticationCredentials()
    Select Case endpointType
        Case AuthenticationProviderType.ActiveDirectory
                  authCredentials.ClientCredentials.Windows.ClientCredential =
                      New System.Net.NetworkCredential(_userName, _password, _domain)
        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()
        Case Else ' 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
    End Select

    Return authCredentials
End Function

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é Microsoft Office 365/MOS, les utilisateurs en ligne dont les identités sont fédérées dans le cloud, et les utilisateurs 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 });
}

Private Function GetProxy(Of TService As Class,
                              TProxy As ServiceProxy(Of TService)) _
                          (ByVal serviceManagement As IServiceManagement(Of TService),
                           ByVal authCredentials As AuthenticationCredentials) As TProxy
    Dim classType As Type = GetType(TProxy)

    If serviceManagement.AuthenticationType <>
        AuthenticationProviderType.ActiveDirectory Then
        Dim tokenCredentials As AuthenticationCredentials =
            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 CType(classType _
        .GetConstructor(New Type() {GetType(IServiceManagement(Of TService)), GetType(SecurityTokenResponse)}) _
        .Invoke(New Object() {serviceManagement, tokenCredentials.SecurityTokenResponse}), TProxy)
    End If

    ' 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 CType(classType _
        .GetConstructor(New Type() {GetType(IServiceManagement(Of TService)), GetType(ClientCredentials)}) _
        .Invoke(New Object() {serviceManagement, authCredentials.ClientCredentials}), TProxy)
End Function

Pour tous les déploiements différents des locaux (Active Directory, sans revendications), la méthode Authenticate 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

Connexion avec Microsoft Office 365 et Microsoft Dynamics CRM Online
Utilisateurs synchronisés dans Microsoft Dynamics CRM Online et Office 365
Exemple : Authentifier les utilisateurs avec des services Web Microsoft Dynamics CRM
Code d’assistance : classe ServerConnection
Active Directory et authentification basée sur les revendications
Connexion simplifiée à Microsoft Dynamics CRM 2015

© 2017 Microsoft. Tous droits réservés. Copyright