Autenticar usuarios de Office 365 con los servicios web de Microsoft Dynamics 365 (online)
Publicado: enero de 2017
Se aplica a: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online
Este tema se aplica a los clientes que tienen acceso a Microsoft Dynamics 365 (online) a través de Entorno de Microsoft Online Services. Existen varios proveedores de identidad de Microsoft Dynamics 365 (online) 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 Microsoft Dynamics 365 (online) 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 Microsoft Dynamics 365 admitidos.
En este tema
Usar las clases simplificadas de autenticación
Autenticar a los usuarios de la cuenta Microsoft con Office 365
Autenticación detallada
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 acerca del uso de estas clases proxy, consulte Autenticación mediante las clases del proxy de cliente.
Otro método de autenticación utiliza la clase CrmConnection. Con solo algunas líneas de código, la aplicación se puede autenticar en los servicios web y empezar a llamar a métodos web. Para obtener más información sobre la clase CrmConnection, consulte Conexión a simplificada a Microsoft Dynamics CRM. El código de ejemplo está disponible en el tema Ejemplo: Inicio rápido de conexión simplificada mediante Microsoft Dynamics CRM.
CrmConnection connection = CrmConnection.Parse (connectionString);
using ( OrganizationService orgService = new OrganizationService(connection)) { }
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 el tema 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: Inicio rápido para Microsoft Dynamics 365.
La lista completa de clases de autenticación disponibles en SDK de Microsoft Dynamics 365 se muestra en la sección Clases de autenticación .
Autenticar a los usuarios de la cuenta Microsoft con Office 365
La aplicación necesita ayudar a los usuarios de Microsoft Dynamics 365 (online) 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 Microsoft Online Services de Microsoft Dynamics 365 (online).
Para ello, pase las credenciales indicadas en el constructor OrganizationServiceProxy o el método Authenticate 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>
Puede obtener las credenciales del dispositivo mediante uno de los métodos públicos, como LoadOrRegister, en el código auxiliar de DeviceIdManager . Para obtener más información, vea Código de aplicación auxiliar: Clase de DeviceIdManager.
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 Microsoft Dynamics 365 (online) 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 Microsoft Dynamics 365 . 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 con los servicios web de Microsoft Dynamics 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 Microsoft Dynamics 365 (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
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;
}
''' <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
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 Microsoft 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 });
}
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
En todas las implementaciones, excepto las locales (Active Directory, sin notificaciones), se invoca el método Authenticate 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.
Ver también
Conexión con Microsoft Office 365 y Microsoft Dynamics 365 (online)
Usuarios sincronizados en Microsoft Dynamics 365 (online) y Office 365
Ejemplo: Autenticar usuarios con los servicios web de Microsoft Dynamics 365
Código auxiliar: clase ServerConnection
Active Directory y autenticación basada en notificaciones
Usar cadenas de conexión en útiles de XRM para conectarse a Dynamics 365
Microsoft Dynamics 365
© 2017 Microsoft. Todos los derechos reservados. Copyright