Share via


Authentifizieren von Office 365 Benutzern mit Customer Engagement Webdiensten

Dieses Thema gilt für Kunden, die über die Microsoft Online Services Umgebung auf Dynamics 365 Customer Engagement (on-premises) zugreifen. Es gibt mehrere Dynamics 365 Customer Engagement (on-premises)-Identitätsanbieter, die berücksichtigt werden müssen, wenn Sie eine Anwendung entwickeln, die eine Verbindung mit den Organisations- oder Ermittlungswebdiensten herstellt. Diese Anbieter können als verwaltete Domäne, Verbund und Microsoft-Konto identifiziert werden. Dieses Thema behandelt die Dynamics 365 Customer Engagement (on-premises)-Webdienstauthentifizierung mit verwalteter Domäne und verbundenen Identitätsanbietern, obwohl die gleichen hier angezeigten Klassen und der gleiche Code auch mit allen unterstützten Identitätsanbietern und Dynamics 365 Customer Engagement (on-premises)-Bereitstellungstypen funktionieren.

Vereinfachte Authentifizierungsklassen verwenden

Sie können die Klassen OrganizationServiceProxy und DiscoveryServiceProxy verwenden, wenn Sie sich bei den Webdiensten authentifizieren.
Weitere Informationen zur Verwendung dieser Proxyklassen finden Sie unter Authentifizierung mithilfe der Clientproxyklassen.

Notiz

Der Beispiel-Hilfecode mit der ServerConnection Klasse wird nicht mehr gepflegt und wird in Zukunft entfernt. Verwenden Sie stattdessen eine der unterstützten Authentifizierungs-APIs in den SDK-Assemblys wie CrmServiceClient.

Ein weiterer Authentifizierungsansatz besteht darin, den Hilfequellcode zu verwenden, der im SDK bereitgestellt wird. Die ServerConnection Hilfeklasse, die im Thema Hilfscode: ServerConnection-Klasse beschrieben ist, bietet die Methoden GetOrganizationProxy und GetProxy für die Authentifizierung an. Wenn Sie den Quellcode für ServerConnection betrachten, sehen Sie, dass GetOrganizationProxy eigentlich GetProxy aufruft.

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

Sie müssen diese Organisations- oder Ermittlungsdienstproxyobjekte in einer using-Anweisung, erstellen, um den Serviceproxy richtig zu löschen, oder Dispose direkt aufrufen. Informationen zum Beispielcode, der die GetOrganizationProxy-Hilfscodemethode verwendet, finden Sie unter Beispiel: Schnellstart.

Die vollständige Liste der Authentifizierungsklassen, die in den SDK-Assemblys verfügbar sind, wird im Abschnitt Authentifizierungsklassen angezeigt.

Benutzer mit Microsoft-Konto mit Office 365 authentifizieren

Ihre Anwendung muss die Dynamics 365 Customer Engagement (on-premises)-Benutzer unterstützen, deren Organisation vom Identitätsanbieter des Microsoft-Kontos auf den Identitätsanbieter der Microsoft Online Services umgestellt wird. In diesem Szenario können die Benutzer ihre Anmeldeinformationen für das Microsoft-Konto angeben, wenn sie sich mit dem Identitätsanbieter von Microsoft Online Services Dynamics 365 Customer Engagement (on-premises) authentifizieren.

Übergeben Sie dafür die ausgefüllten Anmeldeinformationen im OrganizationServiceProxy-Konstruktor oder die AuthenticationCredentials-Methode von der IServiceManagement-Klasse. Die Werte der Anmeldeinformationen werden wie folgt aufgefüllt:

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

Wenn der Code den Identitätsanbietertyp zur Bestimmung der Authentifizierungsart überprüft, dann ist der Zusatzcode erforderlich. Siehe GetCredentials Methode im nächsten Abschnitt für einen Beispielcode, der Benutzer mit übergegangenen Microsoft-Konten unterstützt.

Weitere Informationen zu diesem Übergang finden Sie unter Dynamics 365 Customer Engagement (on-premises) Integration mit Office 365.

Authentifizierung - Vertiefung

Mit den zwei bisher vorgestellten Ansätzen können Benutzer bei den Dynamics 365 Customer Engagement (on-premises)-Webdiensten authentifiziert werden. Die folgenden Informationen veranschaulichen, wie Sie einen Benutzer mithilfe der IServiceManagement<TService>-Klasse authentifizieren. Sie enthalten den Quellcode für die GetProxy-Methode. Das vollständige Beispiel, das die folgenden Beispiele enthält, finden Sie unter Beispiel: Authentifizieren von Office 365 Benutzern. Beachten Sie, dass die Authentifizierung auf dieser Ebene viel mehr Code benötigt.

Der folgende Beispielcode veranschaulicht die Klassen und Methoden, die Sie in Ihrer Anwendung verwenden können, um einen Office 365/MOS-Benutzer mithilfe der Dynamics 365 Customer Engagement (on-premises)-Webdienste zu authentifizieren.



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);
}

Der Code erstellt ein IServiceManagement<TService>-Objekt für den Organisationsservice. Ein Objekt des Typs AuthenticationCredentials wird verwendet, um die Anmeldeinformationen des Benutzers aufzubewahren. Das IServiceManagement-Objekt und die Benutzeranmeldeinformationen werden dann an GetProxy übergeben, um die Webdienstproxyreferenz zu erhalten.



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

Das AuthenticationCredentials-Objekt ist gemäß der abonnierten Identität des angemeldeten Benutzers konfiguriert. Beachten Sie, dass Benutzeranmeldeinformationen für alle Typen von Identitätsanbietern angezeigt werden. Der Standardfall behandelt Office 365/MOS verwaltete Domäne, Online-Benutzer, deren Identitäten in der Cloud zusammengeführt werden, und Benutzer mit Microsoft-Konten im Übergang. Es folgt die Ausführung von GetProxy.



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 });
}

 

Bei allen Bereitstellungen, die nicht lokal erfolgen (Active Directory, ohne Ansprüche), wird die Methode Authenticate(AuthenticationCredentials) aufgerufen und anschließend der Service-Proxy instanziiert. Beachten Sie, dass die von Authenticate zurückgegebenen Authentifizierungsinformationen die Sicherheitstokenantwort enthalten, die im Serviceproxykonstruktor verwendet wird. Die zuvor aufgeführte allgemeine GetProxy-Methode kann verwendet werden kann, um entweder ein Objektverweis auf OrganizationServiceProxy oder auf DiscoveryServiceProxy zu erhalten.

Siehe auch

Verbinden Sie sich mit Microsoft Office 365 und Dynamics 365 Customer Engagement (on-premises)Beispiel: Authentifizierung von Office 365 Benutzern
Hilfscode: ServerConnection-Klasse
Active Directory und Anspruchsbasierte Authentifizierung
Verwenden von Verbindungszeichenfolgen im XRM-Tooling zur Herstellung einer Verbindung mit Dynamics 365 Customer Engagement (on-premises)