Del via


Godkende Office 365-brugere med Microsoft Dynamics 365 (online)-webtjenester

 

Udgivet: januar 2017

Gælder for: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online

Dette emne gælder for kunder, der har adgang til Microsoft Dynamics 365 (online) gennem Microsoft Online Services-miljø. Der er flere Microsoft Dynamics 365 (online)-id-udbydere, der skal redegøres for, når du udvikler et program, der opretter forbindelse til organisations- eller registreringswebtjenesten. Disse udbydere kan identificeres som administreret domæne, organisationsnetværk og Microsoft-konto. Dette emne fokuserer på Microsoft Dynamics 365 (online)-webtjenestegodkendelse med administrerede domæne- og organisationsnetværksudbydere, men samme klasser og kode, der vises her, virker også med alle understøttede id-udbydere og Microsoft Dynamics 365-udrulningstyper.

Dette emne indeholder

Anvende de forenklede godkendelsesklasser

Godkende brugere af Microsoft-konto med Office 365

Dybdegående godkendelse

Anvende de forenklede godkendelsesklasser

Du kan bruge klasserne OrganizationServiceProxy og DiscoveryServiceProxy til godkendelse hos webtjenesterne. Du kan finde flere oplysninger om brug af disse proxyklasser i Godkendelse ved hjælp af klientproxyklasser.

En anden fremgangsmåde for godkendelse bruger CrmConnection-klassen. Med blot et par linjer kode kan dit program bruge godkendelse hos webtjenester og starte kald af webmetoder. Du kan finde flere oplysninger om CrmConnection-klassen i Forenklet forbindelse til Microsoft Dynamics CRM. Eksempelkode findes i emnet Eksempel: Forenklet forbindelse for hurtig start ved hjælp af emnet Microsoft Dynamics CRM.

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

En anden fremgangsmåde for godkendelse er at bruge hjælpekildekode, der findes i SDK.ServerConnection-hjælpeklassen, der vises i emnet Hjælpekode: ServerConnection-klasse, har GetOrganizationProxy- og GetProxy-metoder for godkendelse. Hvis du ser på kildekoden for ServerConnection, du vil se, at GetOrganizationProxy faktisk kalder GetProxy.

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

Du skal oprette disse organisations- eller registreringsservice-proxyobjekter i en using-sætning for korrekt at bortskaffe serviceproxy eller kalde Dispose direkte. Eksempelkode, som bruger GetOrganizationProxy-hjælpekodemetoden, findes i Eksempel: Startvejledning til Microsoft Dynamics 365.

En komplet liste over godkendelsesklasser, der er tilgængelige i Microsoft Dynamics 365-SDK, er vist i afsnittet Godkendelsesklasser.

Godkende brugere af Microsoft-konto med Office 365

Dit program skal understøtte de Microsoft Dynamics 365 (online)-brugere, hvis organisation er gået fra Microsoft-konto som identitetsudbyder til Microsoft Online Services som identitetsudbyder. I dette scenario kan brugerne angive deres Microsoft-konto-logonlegitimationsoplysninger, når de godkender hos Microsoft Online Services-identitetsudbyderen af Microsoft Dynamics 365 (online).

For at gøre dette skal du overføre de udfyldte oplysninger i OrganizationServiceProxy-konstruktøren eller Authenticate-metoden til IServiceManagement-klassen. Værdierne i legitimationsoplysningerne udfyldes på følgende måde:

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

Du kan hente legitimationsoplysningerne for enheden ved hjælp af de offentlige metoder, for eksempel LoadOrRegister, i DeviceIdManager-hjælpekode. Du kan finde flere oplysninger i Hjælpekode: DeviceIdManager-klasse.

Hvis din kode kontrollerer typen af identitetsudbyder for at bestemme, hvordan der skal godkendes, er yderligere kode nødvendig. Se GetCredentials-metoden i næste afsnit med eksempelkode, der understøtter overførte Microsoft-konto-brugere.

Du kan finde flere oplysninger om denne overførsel i Integration af Microsoft Dynamics 365 (online) med Office 365.

Dybdegående godkendelse

Den foregående beskrivelse introducerer to enkle metoder, der kan bruges til at godkende en bruger med Microsoft Dynamics 365-webtjenester. Følgende oplysninger viser, hvordan du godkender en bruger ved hjælp af IServiceManagement<TService>-klassen, og indeholder kildekoden til GetProxy-metoden. Du kan se hele eksemplet, der indeholder følgende eksempler, i Eksempel: Godkende brugere med Microsoft Dynamics 365-webtjenester. Du vil bemærke, at godkendelse på dette niveau bruger meget mere kode.

Følgende eksempelkode demonstrerer de klasser og metoder, der kan bruges i programmet til at godkende en Office 365/MOS-bruger ved hjælp af Microsoft Dynamics 365 (online)-webtjenester.


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

Koden opretter et IServiceManagement<TService>-objekt for organisationstjenesten. Et objekt af typen AuthenticationCredentials bruges til at indeholde brugerens logonoplysninger.IServiceManagement-objektet og brugerlegitimationsoplysningerne sendes derefter til GetProxy for at hente webtjenestens proxyreference.


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

AuthenticationCredentials-objektet er konfigureret i henhold til abonnementsidentiteten for den bruger, der er logget på. Bemærk, at brugerens legitimationsoplysninger til alle typer af id-udbydere vises. Standardsagen håndterer Microsoft Office 365/MOS-administrerede domæneonlinebrugere, hvis identitet har organisationsnetværk i skyen, og overførte Microsoft-konto-brugere. Lad os se på, hvad GetProxy rent faktisk udfører.


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

For alle udrulninger, der ikke er i det lokale miljø (Active Directory, uden krav), kaldes Authenticate-metoden, og derefter instantieres serviceproxy. Bemærk, at legitimationsoplysningerne, der blev returneret fra Authenticate, indeholder det sikkerhedstokensvar, der bruges i serviceproxy-konstruktøren. Den generiske GetProxy-metode, der tidligere er vist, kan kun bruges til at hente en objektreference til enten OrganizationServiceProxy eller DiscoveryServiceProxy.

Se også

Oprette forbindelse til Microsoft Office 365 og Microsoft Dynamics 365 (online)
Synkroniserede brugere i Microsoft Dynamics 365 (online) og Office 365
Eksempel: Godkende brugere med Microsoft Dynamics 365-webtjenester
Hjælpekode: ServerConnection-klasse
Active Directory og kravsbaseret godkendelse
Bruge forbindelsesstrenge i XRM-værktøj til at oprette forbindelse til Dynamics 365

Microsoft Dynamics 365

© 2017 Microsoft. Alle rettigheder forbeholdes. Ophavsret