Autenticar usuarios de Office 365 con los servicios web de Microsoft Dynamics CRM Online
Publicado: noviembre de 2016
Se aplica a: Dynamics CRM 2015
Este tema se aplica a los clientes que tienen acceso a Microsoft Dynamics CRM Online a través de Entorno de Microsoft Online Services. Existen varios proveedores de identidad de Microsoft Dynamics CRM 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 CRM 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 usa 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 acerca de la clase CrmConnection, consulte Conexión simplificada a Microsoft Dynamics CRM 2015. El código de ejemplo está disponibles en el tema Ejemplo: tutorial de conexión simplificada con 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 CRM.
La lista completa de clases de autenticación disponibles en Microsoft Dynamics CRM SDK 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 CRM 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 CRM Online.
Para ello, pase las credenciales de inicio de sesión 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 logon 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 CRM 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 CRM. 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 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
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 CRM Online
Usuarios sincronizados en Microsoft Dynamics CRM Online y Office 365
Ejemplo: Autenticar usuarios con los servicios web de Microsoft Dynamics CRM
Código auxiliar: clase ServerConnection
Active Directory y autenticación basada en notificaciones
Conexión simplificada a Microsoft Dynamics CRM 2015
© 2017 Microsoft. Todos los derechos reservados. Copyright