Partilhar via


Autenticar os usuários do Office 365 com os serviços web do Microsoft Dynamics CRM Online

 

Publicado: novembro de 2016

Aplicável a: Dynamics CRM 2015

Este tópico se aplica aos clientes que acessam Microsoft Dynamics CRM Online por meio de Ambiente do Microsoft Online Services. Há vários provedores de identidade Microsoft Dynamics CRM Online que devem ser contabilizados quando você desenvolve um aplicativo que se conecta aos serviços Web de Organização ou de Descoberta. Esses provedores podem ser identificados como de domínio gerenciado, federado e Conta da Microsoft. Este tópico enfoca na autenticação do serviço da Web Microsoft Dynamics CRM Online com domínio gerenciado e provedores de identidades federados, embora as mesmas classes e códigos mostrados aqui também funcionam com todos os provedores de identidades suportados e com os tipos de implantação Microsoft Dynamics 365.

Neste tópico

Use as classes de autenticação simplificadas

Autenticar os usuários da conta da Microsoft com o Office 365

Autenticação deep dive

Use as classes de autenticação simplificadas

Você pode usar as classes de OrganizationServiceProxy e de DiscoveryServiceProxy ao autenticar com os serviços da Web. Para obter mais informações sobre como usar estas classes proxy, consulte Autenticação usando as classes do proxy do cliente.

Outra opção de autenticação usa a classe de CrmConnection. Com apenas algumas linhas de código, o aplicativo pode autenticar com os serviços web e começar a chamar os métodos da web. Para obter mais informações sobre a classe CrmConnection, consulte a Conexão simplificada do Microsoft Dynamics CRM 2015. O código de exemplo está disponível no tópico Exemplo: início rápido de conexão simplificada usando o Microsoft Dynamics CRM.

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

Outra opção de autenticação é usar o código de fonte auxiliar fornecido no SDK. A classe auxiliar de ServerConnection, mostrada no tópico Código auxiliar: Classe ServerConnection, fornece métodos GetOrganizationProxy e GetProxy para autenticação. Se você analisar o código fonte de ServerConnection, você verá que GetOrganizationProxy atualmente chama GetProxy.

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

Você deve criar esse objetos do proxy de serviço de organização ou de descoberta em uma política de using para eliminar corretamente do proxy de serviço ou ligar Dispose diretamente. Para código de exemplo que usa o método de código auxiliar GetOrganizationProxy, consulte Exemplo: início rápido do Microsoft Dynamics CRM.

A lista completa de classes de autenticação disponível em SDK do Microsoft Dynamics CRM é exibida na Classes de autenticação.

Autenticar os usuários da conta da Microsoft com o Office 365

O aplicativo precisa oferecer suporte aqueles usuários Microsoft Dynamics CRM Online cuja organização esta transitada do provedor de identidades Conta da Microsoft ao provedor de identidades Microsoft Online Services. Neste cenário, os usuários podem fornecer suas credenciais de logon de Conta da Microsoft quando eles autenticam com o provedor de identidades Microsoft Online Services de Microsoft Dynamics CRM Online.

Para fazer isso, passe as credenciais de logon preenchidas no construtor OrganizationServiceProxy ou no método Authenticate da classe IServiceManagement. Os valores de credenciais são preenchidos da seguinte forma:

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

Você pode obter as credenciais do dispositivo usando um dos métodos públicos, por exemplo LoadOrRegister no código auxiliar DeviceIdManager. Para obter mais informações, consulte Código auxiliar: Classe DeviceIdManager.

Se o código verifica o tipo de provedor de identidade para determinar como autenticar, então o código adicional é necessário. Consulte o método de GetCredentials na seção a seguir para o código de exemplo que oferece suporte aos usuários Conta da Microsoft em transição.

Para obter mais informações sobre esta transição, consulte Microsoft Dynamics CRM Online Integração com o Office 365.

Autenticação deep dive

O debate anterior apresentou duas técnicas simples que podem ser usadas ​​para autenticar um usuário com os serviços web Microsoft Dynamics 365. As informações a seguir mostram como autenticar um usuário usando a classe IServiceManagement<TService> e inclui o código fonte no método de GetProxy. Para obter o exemplo completo que contém os seguintes exemplos, consulte Exemplo: autenticar os usuários com os serviços web do Microsoft Dynamics CRM. Você notará que a autenticação, a este nível, leva muito mais código.

O código de exemplo a seguir demonstra as classes e os métodos que você pode usar no aplicativo para autenticar um usuário Office 365/MOS usando os serviços 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

O código cria um objeto IServiceManagement<TService> para o serviço da organização. Um objeto do tipo AuthenticationCredentials é usado para conter as credenciais de logon do usuário. As credenciais do objeto e do usuário IServiceManagement são então transmitidas para GetProxy para obter a referência do proxy de serviço 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

O objeto AuthenticationCredentials é configurado de acordo com a identidade subscrita pelo usuário conectado. Observe que as credenciais de usuário são mostradas para todos os tipos de provedores de identidade. O caso padrão executa o domínio gerenciado Microsoft Office 365/MOS, os usuários on-line cujas identidades são federadas em nuvem e os usuários Conta da Microsoft em transição. Agora vamos dar uma olhada no que GetProxy realmente faz.


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

Para todas as outras implantações diferentes do local (Active Directory, sem declarações), o método Authenticate é chamado e, em seguida, o proxy do serviço é instanciado. Observe que as credenciais de autenticação devolvidas do Authenticate possuem a resposta de token de segurança que é usada no construtor do proxy de serviço. O método GetProxy genérico mostrado anteriormente pode ser usado para obter uma referência de objeto a OrganizationServiceProxy ou a DiscoveryServiceProxy.

Confira Também

Conectar-se com o Microsoft Office 365 e Microsoft Dynamics CRM Online
Usuários sincronizados no Microsoft Dynamics CRM Online e Office 365
Exemplo: autenticar os usuários com os serviços web do Microsoft Dynamics CRM
Código auxiliar: Classe ServerConnection
Ativar diretório e autenticação com base em declarações
Conexão simplificada do Microsoft Dynamics CRM 2015

© 2017 Microsoft. Todos os direitos reservados. Direitos autorais