Freigeben über


Authentifizieren von Office 365-Benutzern durch die Microsoft Dynamics 365 (online)-Webdienste

 

Veröffentlicht: Januar 2017

Gilt für: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online

Dieses Thema ist für Kunden relevant, die auf Microsoft Dynamics 365 (online) über die Microsoft Online Services-Umgebung zugreifen. Es gibt mehrere Microsoft Dynamics 365 (online)-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, verbunden, und Microsoft-Konto identifiziert werden. Dieses Thema behandelt die Microsoft Dynamics 365 (online)-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 Microsoft Dynamics 365-Bereitstellungstypen funktionieren.

In diesem Thema

Vereinfachte Authentifizierungsklassen verwenden

Benutzer mit Microsoft-Konto mit Office 365 authentifizieren

Authentifizierung - Vertiefung

Vereinfachte Authentifizierungsklassen verwenden

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

Ein weiterer Authentifizierungsansatz verwendet die CrmConnection-Klasse. Mit nur wenigen Codezeilen kann sich die Anwendung bei den Webdiensten authentifizieren und mit dem Aufruf von Webmethoden beginnen. Weitere Informationen zur Klasse CrmConnection finden Sie unter vereinfachte Verbindung mit Microsoft Dynamics CRM. Beispielcode ist verfügbar im Thema Beispiel: Erste Schritte für einfacheres Herstellen von Verbindungen mithilfe von Microsoft Dynamics CRM.

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

Ein weiterer Authentifizierungsansatz besteht darin, den Hilfequellcode zu verwenden, der im SDK bereitgestellt wird. Die Hilfsklasse ServerConnection im Thema Hilfscode: Klasse "ServerConnection" bietet für die Authentifizierung die Methoden GetOrganizationProxy und GetProxy. 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-Hilfecodemethode verwendet, finden Sie unter Beispiel: Erste Schritte für Microsoft Dynamics 365.

Die vollständige Liste der Authentifizierungsklassen, die in Microsoft Dynamics 365 SDK verfügbar sind, wird im Abschnitt Authentifizierungsklassen angezeigt.

Benutzer mit Microsoft-Konto mit Office 365 authentifizieren

Die Anwendung muss die Microsoft Dynamics 365 (online)-Benutzer unterstützen, deren Organisation von dem Microsoft-Konto-Identitätsanbieter auf den Microsoft Online Services-Identitätsanbieter übertragen wird. In diesem Szenario können Benutzer ihre Microsoft-Konto-Anmeldeinformationen zur Verfügung stellen, wenn sie sich mit dem Microsoft Online Services-Identitätsanbieter von Microsoft Dynamics 365 (online) authentifizieren.

Übergeben Sie dafür die ausgefüllten Anmeldeinformationen im OrganizationServiceProxy-Konstruktor oder die Authenticate-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>

Sie können die Geräteanmeldeinformationen erhalten, indem Sie eine der öffentlichen Methoden verwenden, z. B. LoadOrRegister im DeviceIdManager-Hilfecode. Weitere Informationen finden Sie unter Hilfscode: Klasse DeviceIdManager.

Wenn der Code den Identitätsanbietertyp zur Bestimmung der Authentifizierungsart überprüft, dann ist der Zusatzcode erforderlich. Die GetCredentials-Methode im nächsten Abschnitt zeigt Beispielcode, der übertragende Microsoft-Konto-Benutzer unterstützt.

Weitere Informationen zu diesem Übergang finden Sie unter Microsoft Dynamics 365 (online)-Integration in Office 365.

Authentifizierung - Vertiefung

Mit den zwei bisher vorgestellten Ansätzen können Benutzer bei den Microsoft Dynamics 365-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 Benutzern durch die Microsoft Dynamics 365-Webdienste. 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 Microsoft Dynamics 365 (online)-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);
}

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

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

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 Microsoft Office 365 /MOS verwaltete Domänen, Onlinebenutzer mit Identitäten im Cloudverbund und übertragene Microsoft-Konto-Benutzer. 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 });
}

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

Bei allen Bereitstellungen, die nicht lokal (Active Directory ohne Ansprüche) sind, wird die Authenticate-Methode aufgerufen und der Serviceproxy 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 mit Microsoft Office 365 und Microsoft Dynamics 365 (online)
Synchronisierte Benutzer in Microsoft Dynamics 365 (online) und Office 365
Beispiel: Authentifizieren von Benutzern durch die Microsoft Dynamics 365-Webdienste
Hilfscode: Klasse "ServerConnection"
Active Directory und anspruchsbasierte Authentifizierung
Verwenden von Verbindungszeichenfolgen im XRM-Tooling zum Herstellen einer Verbindung zu Dynamics 365

Microsoft Dynamics 365

© 2017 Microsoft. Alle Rechte vorbehalten. Copyright