Delen via


Gebruikers van Office 365 verifiëren met webservices van Microsoft Dynamics 365 (online)

 

Gepubliceerd: januari 2017

Is van toepassing op: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online

Dit geldt voor klanten die toegang hebben tot Microsoft Dynamics 365 (online) via Microsoft Online Services-omgeving. Er zijn meerdere Microsoft Dynamics 365 (online) identiteitproviders waar rekening mee moet worden gehouden wanneer u een toepassing ontwikkelt die verbinding maakt met websites van de organisatie of Discovery. Deze providers kunnen worden geïdentificeerd als beheerd domein, federatief en Microsoft-account. Dit onderwerp is gericht op de Microsoft Dynamics 365 (online) webserviceverificatie met beheerd domein en federatieve identiteitproviders, maar dezelfde klassen en codes die hier worden getoond, werken ook bij alle ondersteunde identiteitproviders Microsoft Dynamics 365 installatietypen.

In dit onderwerp

Gebruik de vereenvoudigde verificatieklassen

Microsoft-accountgebruikers met Office 365 aanmelden

Deep dive verificatie

Gebruik de vereenvoudigde verificatieklassen

U kunt de klassen OrganizationServiceProxy en DiscoveryServiceProxy gebruiken wanneer u aanmeldt bij de webservices. Voor meer informatie over het gebruik van deze proxyklassen, zie Verificatie door de clientproxyklasses te gebruiken.

Een andere verificatiebenadering gebruikt de klasse CrmConnection-klasse. Met slechts een paar regels code kan uw toepassing aanmelden bij de webservices en webmethoden aanroepen. Zie voor meer informatie over de klasse CrmConnection het onderwerp Vereenvoudigde verbinding met Microsoft Dynamics CRM. Voorbeeldcode is beschikbaar in het onderwerp Voorbeeld: Snel aan de slag met een vereenvoudigde verbinding met Microsoft Dynamics CRM.

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

Een andere verificatiebenadering is het gebruik van de hulpbroncode in de SDK. De helperklasse ServerConnection, getoond in het onderwerp Helpercode: klasse ServerConnection voorziet de methoden GetOrganizationProxy en GetProxy voor verificatie. Als u de broncode voor ServerConnection bekijkt, ziet u dat GetOrganizationProxy daadwerkelijk GetProxy aanroept.

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

U moet deze proxy-objecten voor organisatie of discovery-service in een using instructie maken om de serviceproxy correct te gebruiken, of Dispose rechtstreeks aanroepen. Voor voorbeeldcode die de GetOrganizationProxy hulpcodemethode gebruikt, zie Voorbeeld: Aan de slag voor Microsoft Dynamics 365.

De volledige lijst van verificatieklassen beschikbaar in de Microsoft Dynamics 365 SDK, wordt weergegeven in de sectie Verificatieklasses.

Microsoft-accountgebruikers met Office 365 aanmelden

Uw toepassing moet de Microsoft Dynamics 365 (online) gebruikers ondersteunen wiens organisatie werd overgebracht van de Microsoft-account identiteitsprovider naar de Microsoft Online Services identiteitsprovider. In dit scenario kunnen gebruikers hun Microsoft-account aanmeldgegevens opgeven wanneer ze zich aanmelden bij de Microsoft Online Services identiteitsprovider van Microsoft Dynamics 365 (online).

Als u dit wilt doen, stuurt u de ingevulde aanmeldgegevens in de OrganizationServiceProxy-constructor of de Authenticate-methoden van de klasse IServiceManagement door. De aanmeldgegevens worden als volgt ingevuld:

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

U kunt de apparaatreferenties verkrijgen met behulp van een van de openbare methoden, zoals LoadOrRegister, in de DeviceIdManager helpercode. Raadpleeg Helpercode: klasse DeviceIdManager voor meer informatie.

Als uw code het type identiteitsprovider controleert om te bepalen hoe te verifiëren, is aanvullende code vereist. Zie de methode GetCredentials in de volgende sectie voor voorbeeldcode die overgeplaatste Microsoft-account gebruikers ondersteunt.

Voor meer informatie over deze overdracht, zie Microsoft Dynamics 365 (online) integratie met Office 365.

Deep dive verificatie

De vorige discussie introduceerde twee eenvoudige benaderingen die kunnen worden gebruikt om een gebruiker aan te melden bij de Microsoft Dynamics 365 webservices. De volgende informatie laat zien hoe u een gebruiker verifieert met behulp van de klasse IServiceManagement<TService> en omvat de broncode voor de GetProxy methode. Om het volledige voorbeeld te zien dat de volgende voorbeelden bevat, raadpleegt u Voorbeeld: Gebruikers verifiëren met Microsoft Dynamics 365-webservices. U ziet dat de verificatie op dit niveau veel meer code vereist.

In de volgende voorbeeldcode ziet u de klassen en methoden die u in uw toepassing kunt gebruiken om een Office 365/MOS gebruiker aan te melden bij de Microsoft Dynamics 365 (online) webservices.


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

De code maakt een IServiceManagement<TService> object voor de Organisatieservice. Een object van het type AuthenticationCredentials wordt gebruikt voor de aanmeldgegevens van de gebruiker. De IServiceManagement object- en gebruikersgegevens worden vervolgens doorgegeven aan GetProxy om de proxyverwijzing van de webservice te krijgen.


/// <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

Het AuthenticationCredentials-object wordt geconfigureerd op basis van de geabonneerde identiteit voor de aangemelde gebruiker. Merk op dat de gebruikersreferenties voor alle typen identiteitproviders worden weergegeven. De standaardaanvraag verwerkt Microsoft Office 365/MOS-beheerd domein, online gebruikers wiens identiteiten in de cloud worden gefederaliseerd, en overgebrachte gebruikers van Microsoft-account. Laten we nu eens kijken wat GetProxy werkelijk doet.


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

Voor alle andere implementaties dan on-premises (Active Directory, zonder claims), wordt de Authenticate methode gebruikt en wordt een exemplaar gemaakt van de serviceproxy. Denk eraan dat de geretourneerde aanmeldgegevens van Authenticate de veiligheidstokenrespons bevatten die de serviceproxyconstructor gebruikt. De algemene GetProxy methode die eerder werd getoond, kan worden gebruikt om een objectreferentie te krijgen voor OrganizationServiceProxy of DiscoveryServiceProxy.

Zie ook

Verbinding maken met Microsoft Office 365 en Microsoft Dynamics 365 (online)
Gesynchroniseerde gebruikers in Microsoft Dynamics 365 (online) en Office 365
Voorbeeld: Gebruikers verifiëren met Microsoft Dynamics 365-webservices
Helpercode: klasse ServerConnection
Active Directory en verificatie op basis van claims
Verbinding maken met Dynamics 365 door middel van verbindingsreeksen in XRM-tooling

Microsoft Dynamics 365

© 2017 Microsoft. Alle rechten voorbehouden. Auteursrecht