Compartir vía


Autenticar usuarios de Office 365 con los servicios web de Customer Engagement

Este tema se aplica a los clientes que tienen acceso a Dynamics 365 Customer Engagement (on-premises) para aplicaciones a través del entorno de Microsoft Online Services. Existen varios proveedores de identidad de Dynamics 365 Customer Engagement (on-premises) que se deben tener en cuenta cuando se desarrolla una aplicación conectada a los servicios web de la organización o de detección. Estos proveedores se pueden identificar como dominio administrado, federado y cuenta de Microsoft. Este tema se centra en la autenticación del servicio web de Dynamics 365 Customer Engagement (on-premises) con dominio administrado y proveedores de identidad federada, aunque las mismas clases y código que se muestran aquí funcionan también con todos los proveedores de identidades y tipos de despliegue de Dynamics 365 Customer Engagement (on-premises) admitidos.

Usar las clases simplificadas de autenticación

Puede usar las clases OrganizationServiceProxy y DiscoveryServiceProxy al autenticarse en los servicios web.
Para obtener más información sobre el uso de estas clases de proxy, consulte Autenticación mediante las clases del proxy de cliente.

Nota

El código auxiliar de muestra que contiene la clase ServerConnection ya no se mantiene y se eliminará en algún momento en el futuro. En su lugar, use una de las API de autenticación compatibles en los conjuntos de SDK, como CrmServiceClient.

Otro método de autenticación pasa por usar el código fuente del ayudante proporcionado en el SDK. La clase auxiliar de ServerConnection, mostrada en Código auxiliar: clase ServerConnection, proporciona los métodos de autenticación GetOrganizationProxy y GetProxy. Si examina el código abierto de ServerConnection, verá que GetOrganizationProxy realmente llama a GetProxy.

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

Debe crear estos objetos del proxy de la organización o del servicio de detección en una instrucción using para disponer correctamente del proxy de servicio, o llamar directamente a Dispose. Para código de ejemplo que usa el método del código del ayudante GetOrganizationProxy , consulte Ejemplo: Tutorial.

La lista completa de clases de autenticación disponibles en los ensamblados del SDK se muestra en la sección Clases de autenticación.

Autenticar a los usuarios de la cuenta con Office 365

La aplicación necesita ayudar a los usuarios de Dynamics 365 Customer Engagement (on-premises) cuya organización haya pasado de proveedor de identidad de cuenta de Microsoft a proveedor de identidad de Microsoft Online Services. En este escenario, los usuarios pueden proporcionar sus credenciales de inicio de sesión de cuenta de Microsoft cuando se autentican con el proveedor de identidad de Microsoft Online Services de Dynamics 365 Customer Engagement (on-premises).

Para ello, pase las credenciales indicadas en el constructor OrganizationServiceProxy o el método AuthenticationCredentials de la clase IServiceManagement. Los valores de credenciales se completan de la siguiente manera:

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

Si el código comprueba el tipo de proveedor de identidad para determinar cómo autenticar, se necesita código adicional. Consulte el método GetCredentials en la siguiente sección para ver el código de ejemplo compatible con usuarios en transición de cuenta de Microsoft.

Para obtener más información acerca de esta transición, consulte Integración de Dynamics 365 Customer Engagement (on-premises) con Office 365.

Autenticación detallada

La discusión anterior introdujo dos enfoques sencillos que se pueden usar para autenticar un usuario con los servicios web de Dynamics 365 Customer Engagement (on-premises) . La información siguiente muestra cómo autenticar un usuario mediante la clase IServiceManagement<TService> e incluye el código fuente del método GetProxy . Para ver la muestra completa que incluye los siguientes ejemplos, consulte Ejemplo: Autenticar usuarios de Office 365. Advertirá que autenticación a este nivel requiere mucho más código.

El siguiente código de ejemplo muestra las clases y métodos que puede usar en la aplicación para autenticar a un usuario de Office 365/MOS mediante los servicios 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);
}

El código crea un objeto de IServiceManagement<TService> para el servicio de la organización. Un objeto de tipo AuthenticationCredentials se usa para contener las credenciales de inicio de sesión del usuario. Las credenciales de objetos y del usuario de IServiceManagement se pasan a continuación a GetProxy para obtener la referencia del proxy de servicio 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;
}

El objeto AuthenticationCredentials está configurado de acuerdo a la identidad suscrita para el usuario con sesión iniciada. Tenga en cuenta que se muestran las credenciales de usuario de todos los tipos de proveedores de identidad. El caso predeterminado controla el dominio administrado de Office 365/MOS, los usuarios en línea cuyas identidades están federadas en la nube y los usuarios pasados de cuenta de Microsoft. Ahora, analicemos lo que hace GetProxy realmente.



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

 

En todas las implementaciones, excepto las locales (Active Directory, sin notificaciones), se invoca el método Authenticate(AuthenticationCredentials) y después se crea una instancia del proxy de servicio. Observe que las credenciales de autenticación devueltas desde Authenticate contienen la respuesta del token de seguridad que se usa en el constructor del proxy de servicio. El método genérico de GetProxy indicado anteriormente se puede usar para obtener una referencia de objeto a OrganizationServiceProxy o a DiscoveryServiceProxy.

Vea también

Conectar con Microsoft Office 365 y Dynamics 365 Customer Engagement (on-premises)Ejemplo: Autenticar usuarios de Office 365
Código auxiliar: clase ServerConnection
Autenticación basada en notificaciones y Active Directory
Usar cadenas de conexión en útiles de XRM para conectarse a Dynamics 365 Customer Engagement (on-premises)