Tutorial: Erstellen eines SCIM-Endpunkts und Konfigurieren der Benutzerbereitstellung mit Azure ADTutorial - Build a SCIM endpoint and configure user provisioning with Azure AD

Als Anwendungsentwickler können Sie die SCIM-Benutzerverwaltungs-API (System for Cross-Domain Identity Management, System für die domänenübergreifende Identitätsverwaltung) verwenden, um die automatische Bereitstellung von Benutzern und Gruppen zwischen Ihrer Anwendung und Azure AD zu aktivieren.As an application developer, you can use the System for Cross-Domain Identity Management (SCIM) user management API to enable automatic provisioning of users and groups between your application and Azure AD. In diesem Artikel wird beschrieben, wie ein SCIM-Endpunkt erstellt und in den Azure AD-Bereitstellungsdienst integriert wird.This article describes how to build a SCIM endpoint and integrate with the Azure AD provisioning service. Die SCIM-Spezifikation bietet ein allgemeines Benutzerschema für die Bereitstellung.The SCIM specification provides a common user schema for provisioning. Bei der Verwendung mit Verbundstandards wie SAML oder OpenID Connect bietet SCIM Administratoren eine auf Standards basierende End-to-End-Lösung für die Zugriffsverwaltung.When used in conjunction with federation standards like SAML or OpenID Connect, SCIM gives administrators an end-to-end, standards-based solution for access management.

SCIM ist eine standardisierte Definition von zwei Endpunkten: einem „/Users“- und einem „/Group“-Endpunkt.SCIM is a standardized definition of two endpoints: a /Users endpoint and a /Groups endpoint. Es verwendet allgemeine REST-Verben zum Erstellen, Aktualisieren und Löschen von Objekten und ein vordefiniertes Schema für allgemeine Attribute wie Gruppenname, Benutzername, Vorname, Nachname und E-Mail-Adresse.It uses common REST verbs to create, update, and delete objects, and a pre-defined schema for common attributes like group name, username, first name, last name and email. Apps, die eine SCIM 2.0 REST-API bieten, können den Aufwand für die Arbeit mit einer proprietären Benutzerverwaltungs-API reduzieren oder eliminieren.Apps that offer a SCIM 2.0 REST API can reduce or eliminate the pain of working with a proprietary user management API. So ist z. B. jeder konforme SCIM-Client in der Lage, ein HTTP POST für ein JSON-Objekt an den „/Users“-Endpunkt zu senden, um einen neuen Benutzereintrag zu erstellen.For example, any compliant SCIM client knows how to make an HTTP POST of a JSON object to the /Users endpoint to create a new user entry. Anstatt eine leicht abweichende API für dieselben grundlegenden Aktionen zu benötigen, können Apps, die dem SCIM-Standard entsprechen, sofort die Vorteile bereits vorhandener Clients, Tools und Codes nutzen.Instead of needing a slightly different API for the same basic actions, apps that conform to the SCIM standard can instantly take advantage of pre-existing clients, tools, and code.

Bereitstellen von Azure AD für eine App mit SCIM

Das in SCIM 2.0 definierte Standard-Benutzerobjektschema und die REST-APIs für die Verwaltung (RFC 7642, 7643, 7644) ermöglichen eine einfachere Integration von Identitätsanbietern und Apps.The standard user object schema and rest APIs for management defined in SCIM 2.0 (RFC 7642, 7643, 7644) allow identity providers and apps to more easily integrate with each other. Anwendungsentwickler, die einen SCIM-Endpunkt erstellen, können die Integration mit jedem SCIM-konformen Client durchführen, ohne selbst Anpassungen vornehmen zu müssen.Application developers that build a SCIM endpoint can integrate with any SCIM-compliant client without having to do custom work.

Die Automatisierung der Bereitstellung für eine Anwendung erfordert die Erstellung und Integration eines SCIM-Endpunkts mit dem Azure AD-SCIM-Client.Automating provisioning to an application requires building and integrating a SCIM endpoint with the Azure AD SCIM client. Führen Sie die folgenden Schritte aus, um die Bereitstellung von Benutzern und Gruppen in Ihrer Anwendung zu starten.Perform the following steps to start provisioning users and groups into your application.

Schritte zur Integration eines SCIM-Endpunkts mit Azure AD

Schritt 1: Entwerfen Ihres Benutzer- und GruppenschemasStep 1: Design your user and group schema

Jede Anwendung erfordert unterschiedliche Attribute, um einen Benutzer oder eine Gruppe zu erstellen.Every application requires different attributes to create a user or group. Starten Sie Ihre Integration, indem Sie die Objekte (Benutzer, Gruppen) und Attribute (Name, Vorgesetzter, Positionsbezeichnung, usw.) identifizieren, die Ihre Anwendung benötigt.Start your integration by identifying the objects (users, groups) and attributes (name, manager, job title, etc.) that your application requires. Mit dem SCIM-Standard wird ein Schema zum Verwalten von Benutzern und Gruppen definiert.The SCIM standard defines a schema for managing users and groups. Für das Kernbenutzerschema sind nur drei Attribute erforderlich: id (vom Dienstanbieter definierter Bezeichner), externalId (vom Client definierter Bezeichner) und Meta (schreibgeschützte, vom Dienstanbieter verwaltete Metadaten).The core user schema only requires three attributes: id (service provider defined identifier), externalId (client defined identifier), and meta (read-only metadata maintained by the service provider). Alle anderen Attribute sind optional.All other attributes are optional. Neben dem Kernbenutzerschema definiert der SCIM-Standard eine Unternehmensbenutzererweiterung und ein Modell für die Erweiterung des Benutzerschemas, um die Anforderungen Ihrer Anwendung zu erfüllen.In addition to the core user schema, the SCIM standard defines an enterprise user extension and a model for extending the user schema to meet your application’s needs. Wenn für Ihre Anwendung beispielsweise der Vorgesetzte des Benutzers erforderlich ist, können Sie mit dem Unternehmensbenutzerschema den Vorgesetzten des Benutzers und mit dem Kernschema die E-Mail-Adresse des Benutzers erfassen.If, for example, your application requires a user’s manager, you can use the enterprise user schema to collect the user’s manager and the core schema to collect the user’s email. Führen Sie die folgenden Schritte aus, um Ihr Schema zu entwerfen:To design your schema, follow the steps below:

  1. Listen Sie die Attribute auf, die für Ihre Anwendung erforderlich sind.List the attributes your application requires. Es kann hilfreich sein, die Anforderungen wie folgt zu unterteilen: Attribute zur Authentifizierung (z. B. Anmeldename und E-Mail-Adresse), Attribute zur Verwaltung des Benutzerlebenszyklus (z. B. Status/aktiv) und weitere Attribute, die zum Funktionieren der jeweiligen Anwendung erforderlich sind (z. B. Vorgesetzter, Tag).It can be helpful to break down your requirements into the attributes needed for authentication (e.g. loginName and email), attributes needed to manage the lifecycle of the user (e.g. status / active), and other attributes needed for your particular application to work (e.g. manager, tag).
  2. Prüfen Sie, ob diese Attribute bereits im Kern- oder Unternehmensbenutzerschema definiert sind.Check whether those attributes are already defined in the core user schema or enterprise user schema. Für Attribute, die Sie benötigen und die nicht im Kern- oder Unternehmensbenutzerschema enthalten sind, müssen Sie eine Erweiterung des Benutzerschemas definieren.If any attributes that you need and aren’t covered in the core or enterprise user schemas, you will need to define an extension to the user schema that covers the attributes you need. Im folgenden Beispiel wurde für den Benutzer eine Erweiterung hinzugefügt, um die Bereitstellung eines „Tags“ für den Benutzer zu ermöglichen.In the example below, we’ve added an extension to the user to allow provisioning a “tag” on a user. Am besten beginnen Sie mit dem Kern- und dem Unternehmensbenutzerschema und erweitern diese später um zusätzliche benutzerdefinierte Schemas.It is best to start with just the core and enterprise user schemas and expand out to additional custom schemas later.
  3. Ordnen Sie die SCIM-Attribute den Benutzerattributen in Azure AD zu.Map the SCIM attributes to the user attributes in Azure AD. Wenn eines der Attribute, die Sie im SCIM-Endpunkt definiert haben, im Azure AD-Benutzerschema keine eindeutige Entsprechung hat, ist die Wahrscheinlichkeit groß, dass die Daten bei den meisten Mandanten überhaupt nicht im Benutzerobjekt gespeichert sind.If one of the attributes you have defined in your SCIM endpoint does not have a clear counterpart on the Azure AD user schema, there is a good chance the data isn’t stored on the user object at all on most tenants. Überlegen Sie, ob dieses Attribut beim Erstellen eines Benutzers eine Wahlmöglichkeit sein kann.Consider whether this attribute can be optional for creating a user. Wenn das Attribut für das Funktionieren Ihrer Anwendung wichtig ist, bitten Sie den Mandantenadministrator, sein Schema zu erweitern, oder verwenden Sie ein Erweiterungsattribut, wie weiter unten für die Eigenschaft „Tags“ gezeigt.If the attribute is critical for your application to work, guide the tenant administrator to extend their schema or use an extension attribute as shown below for the “tags” property.

Tabelle 1: Auflisten der benötigten AttributeTable 1: Outline the attributes that you need

Schritt 1: Bestimmen der für Ihre App erforderlichen AttributeStep 1: Determine attributes your app requires Schritt 2: Zuordnen der App-Anforderungen zum SCIM-StandardStep 2: Map app requirements to SCIM standard Schritt 3: Zuordnen von SCIM-Attributen zu Azure AD-AttributenStep 3: Map SCIM attributes to the Azure AD attributes
loginNameloginName userNameuserName userPrincipalNameuserPrincipalName
firstNamefirstName name.givenNamename.givenName givenNamegivenName
lastNamelastName name.lastNamename.lastName lastNamelastName
workMailworkMail Emails[type eq “work”].valueEmails[type eq “work”].value E-MailMail
managermanager managermanager managermanager
tagtag urn:ietf:params:scim:schemas:extension:2.0:CustomExtension:tagurn:ietf:params:scim:schemas:extension:2.0:CustomExtension:tag extensionAttribute1extensionAttribute1
statusstatus aktivactive isSoftDeleted (berechneter Wert, wird für Benutzer nicht gespeichert)isSoftDeleted (computed value not stored on user)

Das oben definierte Schema kann mit den nachstehenden JSON-Nutzdaten dargestellt werden.The schema defined above would be represented using the JSON payload below. Hinweis: Die JSON-Darstellung enthält neben den für die Anwendung erforderlichen Attributen auch die erforderlichen Attribute id, externalId und meta.Note that in addition to the attributes required for the application, the JSON representation includes the required id, externalId, and meta attributes.

{
     "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User",
      "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User",
      "urn:ietf:params:scim:schemas:extension:CustomExtensionName:2.0:User"],
     "userName":"bjensen",
     "externalId":"bjensen",
     "name":{
       "familyName":"Jensen",
       "givenName":"Barbara"
     },
     "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User": {
     "Manager": "123456"
   },
     "urn:ietf:params:scim:schemas:extension:CustomExtensionName:2.0:CustomAttribute:User": {
     "tag": "701984",
   },
   "meta": {
     "resourceType": "User",
     "created": "2010-01-23T04:56:22Z",
     "lastModified": "2011-05-13T04:42:34Z",
     "version": "W\/\"3694e05e9dff591\"",
     "location":
 "https://example.com/v2/Users/2819c223-7f76-453a-919d-413861904646"
   }
}   

Tabelle 2: Standardzuordnung von BenutzerattributenTable 2: Default user attribute mapping

Sie können dann die folgende Tabelle verwenden, um zu verstehen, wie die von Ihrer Anwendung benötigten Attribute einem Attribut in Azure AD und dem SCIM RFC zugeordnet werden können.You can then use the table below to understand how the attributes your application requires could map to an attribute in Azure AD and the SCIM RFC. Sie können anpassen, wie Attribute zwischen Azure AD und Ihrem SCIM-Endpunkt zugeordnet werden.You can customize how attributes are mapped between Azure AD and your SCIM endpoint. Beachten Sie, dass Sie nicht sowohl Benutzer als auch Gruppen oder alle unten aufgeführten Attribute unterstützen müssen.Note that you don't need to support both users and groups or all the attributes shown below. Sie sind eine Referenz dafür, wie Attribute in Azure AD oft zu Eigenschaften im SCIM-Protokoll zugeordnet werden.They are a reference for how attributes in Azure AD are often mapped to properties in the SCIM protocol.

Azure Active Directory-BenutzerAzure Active Directory user "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User""urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"
IsSoftDeletedIsSoftDeleted aktivactive
departmentdepartment urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:departmenturn:ietf:params:scim:schemas:extension:enterprise:2.0:User:department
displayNamedisplayName displayNamedisplayName
employeeIdemployeeId urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:employeeNumberurn:ietf:params:scim:schemas:extension:enterprise:2.0:User:employeeNumber
Facsimile-TelephoneNumberFacsimile-TelephoneNumber phoneNumbers[type eq "fax"].valuephoneNumbers[type eq "fax"].value
givenNamegivenName name.givenNamename.givenName
jobTitlejobTitle titletitle
mailmail emails[type eq "work"].valueemails[type eq "work"].value
mailNicknamemailNickname externalIdexternalId
managermanager urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:managerurn:ietf:params:scim:schemas:extension:enterprise:2.0:User:manager
mobilemobile phoneNumbers[type eq "mobile"].valuephoneNumbers[type eq "mobile"].value
postalCodepostalCode addresses[type eq "work"].postalCodeaddresses[type eq "work"].postalCode
proxy-Addressesproxy-Addresses emails[type eq "other"].Valueemails[type eq "other"].Value
physical-Delivery-OfficeNamephysical-Delivery-OfficeName addresses[type eq "other"].Formattedaddresses[type eq "other"].Formatted
streetAddressstreetAddress addresses[type eq "work"].streetAddressaddresses[type eq "work"].streetAddress
surnamesurname name.familyNamename.familyName
telephone-Numbertelephone-Number phoneNumbers[type eq "work"].valuephoneNumbers[type eq "work"].value
user-PrincipalNameuser-PrincipalName userNameuserName

Tabelle 3: Standardzuordnung von GruppenattributenTable 3: Default group attribute mapping

Azure Active Directory-GruppeAzure Active Directory group urn:ietf:params:scim:schemas:core:2.0:Groupurn:ietf:params:scim:schemas:core:2.0:Group
displayNamedisplayName displayNamedisplayName
mailmail emails[type eq "work"].valueemails[type eq "work"].value
mailNicknamemailNickname displayNamedisplayName
membersmembers membersmembers
objectIdobjectId externalIdexternalId
proxyAddressesproxyAddresses emails[type eq "other"].Valueemails[type eq "other"].Value

Im SCIM-RFC sind verschiedene Endpunkte definiert.There are several endpoints defined in the SCIM RFC. Sie können mit dem Endpunkt „/User“ beginnen und von dort erweitern.You can get started with the /User endpoint and then expand from there. Der Endpunkt „/Schemas“ ist hilfreich, wenn Sie benutzerdefinierte Attribute verwenden oder sich Ihr Schema häufig ändert.The /Schemas endpoint is helpful when using custom attributes or if your schema changes frequently. Er bietet dem Client die Möglichkeit, automatisch das jeweils aktuelle Schema abzurufen.It enables a client to retrieve the most up-to-date schema automatically. Der Endpunkt „/Bulk“ ist besonders hilfreich für die Unterstützung von Gruppen.The /Bulk endpoint is especially helpful when supporting groups. In der folgenden Tabelle sind die verschiedenen, im SCIM-Standard definierten Endpunkte beschrieben.The table below describes the various endpoints defined in the SCIM standard.

Tabelle 4: Bestimmen der zu entwickelnden EndpunkteTable 4: Determine the endpoints that you would like to develop

ENDPOINTENDPOINT DESCRIPTIONDESCRIPTION
/User/User Führt CRUD-Vorgänge für ein Benutzerobjekt aus.Perform CRUD operations on a user object.
/Group/Group Führt CRUD-Vorgänge für ein Gruppenobjekt aus.Perform CRUD operations on a group object.
/ServiceProviderConfig/ServiceProviderConfig Stellt Einzelheiten zu den unterstützten Features des SCIM-Standards bereit, z. B. die unterstützten Ressourcen und die Authentifizierungsmethode.Provides details about the features of the SCIM standard that are supported, for example the resources that are supported and the authentication method.
/ResourceTypes/ResourceTypes Definiert die Metadaten für jede RessourceSpecifies metadata about each resource
/Schemas/Schemas Der Satz von unterstützten Attributen kann bei einzelnen Clients und Dienstanbietern unterschiedlich sein.The set of attributes supported by each client and service provider can vary. Ein Dienstanbieter enthält möglicherweise name, title und emails, während ein anderer name, title und phoneNumbers verwendet.One service provider might include name, title, and emails, while another service provider uses name, title, and phoneNumbers. Der Endpunkt „/Schemas“ ermöglicht die Erkennung der unterstützten Attribute.The schemas endpoint allows for discovery of the attributes supported.
/Bulk/Bulk Massenvorgänge (bulk operations) ermöglichen das Ausführen von Vorgängen für eine große Sammlung von Ressourcenobjekten in einem einzigen Schritt (z. B. Aktualisieren der Mitgliedschaften für eine große Gruppe).Bulk operations allow you to perform operations on a large collection of resource objects in a single operation (e.g. update memberships for a large group).

Schritt 2: Verstehen der Azure AD-SCIM-ImplementierungStep 2: Understand the Azure AD SCIM implementation

Wichtig

Das Verhalten der Azure AD-SCIM-Implementierung wurde zuletzt am 18. Dezember 2018 aktualisiert.The behavior of the Azure AD SCIM implementation was last updated on December 18, 2018. Informationen zu den Änderungen finden Sie unter Einhaltung des SCIM 2.0-Protokolls des Azure AD-Benutzerbereitstellungsdiensts.For information on what changed, see SCIM 2.0 protocol compliance of the Azure AD User Provisioning service.

Wenn Sie eine Anwendung erstellen, die eine SCIM 2.0-Benutzerverwaltungs-API unterstützt, ist dieser Abschnitt hilfreich. Darin wird detailliert beschrieben, wie der Azure AD-SCIM-Client implementiert wird.If you're building an application that supports a SCIM 2.0 user management API, this section describes in detail how the Azure AD SCIM client is implemented. Außerdem wird gezeigt, wie Sie die Verarbeitung von SCIM-Protokollanforderungen und -antworten modellieren sollten.It also shows how to model your SCIM protocol request handling and responses. Nachdem Sie den SCIM-Endpunkt implementiert haben, können Sie ihn durch Ausführen der im vorherigen Abschnitt beschriebenen Schritte testen.Once you've implemented your SCIM endpoint, you can test it by following the procedure described in the previous section.

Im Rahmen der SCIM 2.0-Protokollspezifikation muss Ihre Anwendung die folgenden Anforderungen erfüllen:Within the SCIM 2.0 protocol specification, your application must meet these requirements:

  • Unterstützt das Erstellen von Benutzern (und optional auch von Gruppen) gemäß Abschnitt 3.3 des SCIM-Protokolls.Supports creating users, and optionally also groups, as per section 3.3 of the SCIM protocol.
  • Unterstützt das Ändern von Benutzern bzw. Gruppen mit PATCH-Anforderungen gemäß Abschnitt 3.5.2 des SCIM-Protokolls.Supports modifying users or groups with PATCH requests, as per section 3.5.2 of the SCIM protocol. Durch die Unterstützung wird sichergestellt, dass Gruppen und Benutzer auf leistungsstarke Weise bereitgestellt werden.Supporting ensures that groups and users are provisioned in a performant manner.
  • Unterstützt das Abrufen einer bekannten Ressource für einen zuvor erstellten Benutzer oder eine Gruppe gemäß Abschnitt 3.4.1 des SCIM-Protokolls.Supports retrieving a known resource for a user or group created earlier, as per section 3.4.1 of the SCIM protocol.
  • Unterstützt das Abfragen von Benutzern bzw. Gruppen gemäß Abschnitt 3.4.2 des SCIM-Protokolls.Supports querying users or groups, as per section 3.4.2 of the SCIM protocol. Standardmäßig werden Benutzer anhand ihrer id abgerufen und nach username und externalId abgefragt. Gruppen werden nach displayName abgefragt.By default, users are retrieved by their id and queried by their username and externalId, and groups are queried by displayName.
  • Unterstützt das Abfragen von Benutzern nach ID und nach Manager gemäß Abschnitt 3.4.2 des SCIM-Protokolls.Supports querying user by ID and by manager, as per section 3.4.2 of the SCIM protocol.
  • Unterstützt das Abfragen von Gruppen nach ID und nach Mitglied gemäß Abschnitt 3.4.2 des SCIM-Protokolls.Supports querying groups by ID and by member, as per section 3.4.2 of the SCIM protocol.
  • Unterstützt den Filter excludedAttributes=members beim Abfragen der Gruppenressource gemäß Abschnitt 3.4.2.5 des SCIM-Protokolls.Supports the filter excludedAttributes=members when querying the group resource, as per section 3.4.2.5 of the SCIM protocol.
  • Akzeptiert ein einzelnes Bearertoken für die Authentifizierung und Autorisierung von Azure AD für Ihre Anwendung.Accepts a single bearer token for authentication and authorization of Azure AD to your application.
  • Unterstützt das vorläufige Löschen eines Benutzers active=false und das Wiederherstellen des Benutzers active=true (das Benutzerobjekt sollte in einer Anforderung zurückgegeben werden, unabhängig davon, ob der Benutzer aktiv ist oder nicht).Supports soft-deleting a user active=false and restoring the user active=true (the user object should be returned in a request whether or not the user is active). Der Benutzer sollte nur dann nicht zurückgegeben werden, wenn er endgültig aus der Anwendung gelöscht wurde.The only time the user should not be returned is when it is hard deleted from the application.

Befolgen Sie bei der Implementierung eines SCIM-Endpunkts die folgenden allgemeinen Richtlinien, um die Kompatibilität mit Azure AD sicherzustellen:Follow these general guidelines when implementing a SCIM endpoint to ensure compatibility with Azure AD:

  • id ist eine erforderliche Eigenschaft für alle Ressourcen.id is a required property for all the resources. Für jede Antwort, die eine Ressource zurückgibt, muss sichergestellt werden, dass jede Ressource diese Eigenschaft aufweist. Eine Ausnahme ist ListResponse mit 0 (null) Elementen.Every response that returns a resource should ensure each resource has this property, except for ListResponse with zero members.
  • Eine Antwort auf eine Abfrage-/Filteranforderung muss immer eine ListResponse sein.Response to a query/filter request should always be a ListResponse.
  • Gruppen sind optional, werden jedoch nur unterstützt, wenn die SCIM-Implementierung PATCH-Anforderungen unterstützt.Groups are optional, but only supported if the SCIM implementation supports PATCH requests.
  • Die PATCH-Antwort muss nicht die gesamte Ressource enthalten.It isn't necessary to include the entire resource in the PATCH response.
  • Microsoft Azure AD verwendet nur die folgenden Operatoren:Microsoft Azure AD only uses the following operators:
    • eq
    • and
  • Unterscheiden Sie bei Strukturelementen in SCIM nicht zwischen Groß- und Kleinschreibung, insbesondere bei op-PATCH-Vorgangswerten gemäß der Definition unter https://tools.ietf.org/html/rfc7644#section-3.5.2.Don't require a case-sensitive match on structural elements in SCIM, in particular PATCH op operation values, as defined in https://tools.ietf.org/html/rfc7644#section-3.5.2. Azure AD gibt die Werte von „op“ mit Add, Replace und Remove aus.Azure AD emits the values of 'op' as Add, Replace, and Remove.
  • Microsoft Azure AD sendet Anforderungen zum Abrufen eines zufälligen Benutzers und einer zufälligen Gruppe, um sicherzustellen, dass der Endpunkt und die Anmeldeinformationen gültig sind.Microsoft Azure AD makes requests to fetch a random user and group to ensure that the endpoint and the credentials are valid. Dies erfolgt auch im Rahmen des Testverbindungsflows im Azure-Portal.It's also done as a part of Test Connection flow in the Azure portal.
  • Das Attribut, nach dem die Ressourcen abgefragt werden können, sollte als entsprechendes Attribut für die Anwendung im Azure-Portal festgelegt werden.The attribute that the resources can be queried on should be set as a matching attribute on the application in the Azure portal. Weitere Informationen finden Sie unter Anpassen von Attributzuordnungen für die Benutzerbereitstellung für SaaS-Anwendungen in Azure Active Directory.For more information, see Customizing User Provisioning Attribute Mappings
  • HTTPS-Unterstützung auf Ihrem SCIM-EndpunktSupport HTTPS on your SCIM endpoint

Benutzerbereitstellung und Aufheben der BereitstellungUser provisioning and deprovisioning

In der folgenden Abbildung sind die Nachrichten dargestellt, die Azure Active Directory an einen SCIM-Dienst sendet, um den Lebenszyklus eines Benutzers im Identitätsspeicher Ihrer Anwendung zu verwalten.The following illustration shows the messages that Azure Active Directory sends to a SCIM service to manage the lifecycle of a user in your application's identity store.

Zeigt die Abfolge der Durchführung und Aufhebung einer BenutzerbereitstellungShows the user provisioning and deprovisioning sequence
Abfolge der Durchführung und Aufhebung einer BenutzerbereitstellungUser provisioning and deprovisioning sequence

Gruppenbereitstellung und Aufheben der BereitstellungGroup provisioning and deprovisioning

Die Gruppenbereitstellung und die Aufhebung einer Gruppenbereitstellung sind optional.Group provisioning and deprovisioning are optional. In der folgenden Abbildung sind die Nachrichten dargestellt, die Azure AD bei entsprechender Implementierung und Aktivierung an einen SCIM-Dienst sendet, um den Lebenszyklus einer Gruppe im Identitätsspeicher Ihrer Anwendung zu verwalten.When implemented and enabled, the following illustration shows the messages that Azure AD sends to a SCIM service to manage the lifecycle of a group in your application's identity store. Diese Nachrichten unterscheiden sich von den Nachrichten zu Benutzern auf zwei Arten:Those messages differ from the messages about users in two ways:

  • Für Anforderungen zum Abrufen von Gruppen wird angegeben, dass das members-Attribut aus allen Ressourcen ausgeschlossen wird, die als Antwort auf die Anforderung bereitgestellt werden.Requests to retrieve groups specify that the members attribute is to be excluded from any resource provided in response to the request.
  • Bei Anforderungen für die Ermittlung, ob ein Referenzattribut einen bestimmten Wert hat, handelt es sich um Anforderungen zum members-Attribut.Requests to determine whether a reference attribute has a certain value are requests about the members attribute.

Zeigt die Abfolge der Durchführung und Aufhebung einer GruppenbereitstellungShows the group provisioning and deprovisioning sequence
Abfolge der Durchführung und Aufhebung einer GruppenbereitstellungGroup provisioning and deprovisioning sequence

SCIM-Protokollanforderungen und -antwortenSCIM protocol requests and responses

Dieser Abschnitt enthält vom Azure AD-SCIM-Client ausgegebene SCIM-Beispielanforderungen und erwartete Beispielantworten.This section provides example SCIM requests emitted by the Azure AD SCIM client and example expected responses. Die besten Ergebnisse erzielen Sie, wenn Sie Ihre App so codieren, dass diese Anforderungen in diesem Format verarbeitet und die erwarteten Antworten ausgegeben werden.For best results, you should code your app to handle these requests in this format and emit the expected responses.

Wichtig

Um zu verstehen, wie und wann der Azure AD-Benutzerbereitstellungsdienst die unten beschriebenen Vorgänge ausgibt, lesen Sie Vorgänge während der Bereitstellung: Startzyklus und Inkrementell in Funktionsweise der Bereitstellung.To understand how and when the Azure AD user provisioning service emits the operations described below, see the section Provisioning cycles: Initial and incremental in How provisioning works.

Vorgänge für BenutzerUser Operations

Vorgänge für GruppenGroup Operations

Vorgänge für BenutzerUser Operations

  • Benutzer können anhand des Attributs userName oder email[type eq "work"] abgefragt werden.Users can be queried by userName or email[type eq "work"] attributes.

Benutzer erstellenCreate User

AnforderungRequest

POST /UsersPOST /Users

{
    "schemas": [
        "urn:ietf:params:scim:schemas:core:2.0:User",
        "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"],
    "externalId": "0a21f0f2-8d2a-4f8e-bf98-7363c4aed4ef",
    "userName": "Test_User_ab6490ee-1e48-479e-a20b-2d77186b5dd1",
    "active": true,
    "emails": [{
        "primary": true,
        "type": "work",
        "value": "Test_User_fd0ea19b-0777-472c-9f96-4f70d2226f2e@testuser.com"
    }],
    "meta": {
        "resourceType": "User"
    },
    "name": {
        "formatted": "givenName familyName",
        "familyName": "familyName",
        "givenName": "givenName"
    },
    "roles": []
}
AntwortResponse

HTTP/1.1 201 CreatedHTTP/1.1 201 Created

{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
    "id": "48af03ac28ad4fb88478",
    "externalId": "0a21f0f2-8d2a-4f8e-bf98-7363c4aed4ef",
    "meta": {
        "resourceType": "User",
        "created": "2018-03-27T19:59:26.000Z",
        "lastModified": "2018-03-27T19:59:26.000Z"
    },
    "userName": "Test_User_ab6490ee-1e48-479e-a20b-2d77186b5dd1",
    "name": {
        "formatted": "givenName familyName",
        "familyName": "familyName",
        "givenName": "givenName",
    },
    "active": true,
    "emails": [{
        "value": "Test_User_fd0ea19b-0777-472c-9f96-4f70d2226f2e@testuser.com",
        "type": "work",
        "primary": true
    }]
}

Benutzer abrufenGet User

AnforderungRequest

GET /Users/5d48a0a8e9f04aa38008GET /Users/5d48a0a8e9f04aa38008

Antwort (Benutzer gefunden)Response (User found)

HTTP/1.1 200 OKHTTP/1.1 200 OK

{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
    "id": "5d48a0a8e9f04aa38008",
    "externalId": "58342554-38d6-4ec8-948c-50044d0a33fd",
    "meta": {
        "resourceType": "User",
        "created": "2018-03-27T19:59:26.000Z",
        "lastModified": "2018-03-27T19:59:26.000Z"
    },
    "userName": "Test_User_feed3ace-693c-4e5a-82e2-694be1b39934",
    "name": {
        "formatted": "givenName familyName",
        "familyName": "familyName",
        "givenName": "givenName",
    },
    "active": true,
    "emails": [{
        "value": "Test_User_22370c1a-9012-42b2-bf64-86099c2a1c22@testuser.com",
        "type": "work",
        "primary": true
    }]
}
AnforderungRequest

GET /Users/5171a35d82074e068ce2GET /Users/5171a35d82074e068ce2

Antwort (Benutzer nicht gefunden.Response (User not found. Beachten Sie, dass das Detail nicht erforderlich ist, sondern nur den Status angibt.)Note that the detail is not required, only status.)
{
    "schemas": [
        "urn:ietf:params:scim:api:messages:2.0:Error"
    ],
    "status": "404",
    "detail": "Resource 23B51B0E5D7AE9110A49411D@7cca31655d49f3640a494224 not found"
}

Benutzer nach Abfrage abrufenGet User by query

AnforderungRequest

GET /Users?filter=userName eq "Test_User_dfeef4c5-5681-4387-b016-bdf221e82081"GET /Users?filter=userName eq "Test_User_dfeef4c5-5681-4387-b016-bdf221e82081"

AntwortResponse

HTTP/1.1 200 OKHTTP/1.1 200 OK

{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
    "totalResults": 1,
    "Resources": [{
        "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
        "id": "2441309d85324e7793ae",
        "externalId": "7fce0092-d52e-4f76-b727-3955bd72c939",
        "meta": {
            "resourceType": "User",
            "created": "2018-03-27T19:59:26.000Z",
            "lastModified": "2018-03-27T19:59:26.000Z"
            
        },
        "userName": "Test_User_dfeef4c5-5681-4387-b016-bdf221e82081",
        "name": {
            "familyName": "familyName",
            "givenName": "givenName"
        },
        "active": true,
        "emails": [{
            "value": "Test_User_91b67701-697b-46de-b864-bd0bbe4f99c1@testuser.com",
            "type": "work",
            "primary": true
        }]
    }],
    "startIndex": 1,
    "itemsPerPage": 20
}

Benutzer nach Abfrage abrufen – keine ErgebnisseGet User by query - Zero results

AnforderungRequest

GET /Users?filter=userName eq "non-existent user"GET /Users?filter=userName eq "non-existent user"

AntwortResponse

HTTP/1.1 200 OKHTTP/1.1 200 OK

{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
    "totalResults": 0,
    "Resources": [],
    "startIndex": 1,
    "itemsPerPage": 20
}

Benutzer aktualisieren [mehrwertige Eigenschaften]Update User [Multi-valued properties]

AnforderungRequest

PATCH /Users/6764549bef60420686bc HTTP/1.1PATCH /Users/6764549bef60420686bc HTTP/1.1

{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
    "Operations": [
            {
            "op": "Replace",
            "path": "emails[type eq \"work\"].value",
            "value": "updatedEmail@microsoft.com"
            },
            {
            "op": "Replace",
            "path": "name.familyName",
            "value": "updatedFamilyName"
            }
    ]
}
AntwortResponse

HTTP/1.1 200 OKHTTP/1.1 200 OK

{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
    "id": "6764549bef60420686bc",
    "externalId": "6c75de36-30fa-4d2d-a196-6bdcdb6b6539",
    "meta": {
        "resourceType": "User",
        "created": "2018-03-27T19:59:26.000Z",
        "lastModified": "2018-03-27T19:59:26.000Z"
    },
    "userName": "Test_User_fbb9dda4-fcde-4f98-a68b-6c5599e17c27",
    "name": {
        "formatted": "givenName updatedFamilyName",
        "familyName": "updatedFamilyName",
        "givenName": "givenName"
    },
    "active": true,
    "emails": [{
        "value": "updatedEmail@microsoft.com",
        "type": "work",
        "primary": true
    }]
}

Benutzer aktualisieren [einwertige Eigenschaften]Update User [Single-valued properties]

AnforderungRequest

PATCH /Users/5171a35d82074e068ce2 HTTP/1.1PATCH /Users/5171a35d82074e068ce2 HTTP/1.1

{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
    "Operations": [{
        "op": "Replace",
        "path": "userName",
        "value": "5b50642d-79fc-4410-9e90-4c077cdd1a59@testuser.com"
    }]
}
AntwortResponse

HTTP/1.1 200 OKHTTP/1.1 200 OK

{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
    "id": "5171a35d82074e068ce2",
    "externalId": "aa1eca08-7179-4eeb-a0be-a519f7e5cd1a",
    "meta": {
        "resourceType": "User",
        "created": "2018-03-27T19:59:26.000Z",
        "lastModified": "2018-03-27T19:59:26.000Z"
        
    },
    "userName": "5b50642d-79fc-4410-9e90-4c077cdd1a59@testuser.com",
    "name": {
        "formatted": "givenName familyName",
        "familyName": "familyName",
        "givenName": "givenName",
    },
    "active": true,
    "emails": [{
        "value": "Test_User_49dc1090-aada-4657-8434-4995c25a00f7@testuser.com",
        "type": "work",
        "primary": true
    }]
}

Benutzer deaktivierenDisable User

AnforderungRequest

PATCH /Users/5171a35d82074e068ce2 HTTP/1.1PATCH /Users/5171a35d82074e068ce2 HTTP/1.1

{
    "Operations": [
        {
            "op": "Replace",
            "path": "active",
            "value": false
        }
    ],
    "schemas": [
        "urn:ietf:params:scim:api:messages:2.0:PatchOp"
    ]
}
AntwortResponse
{
    "schemas": [
        "urn:ietf:params:scim:schemas:core:2.0:User"
    ],
    "id": "CEC50F275D83C4530A495FCF@834d0e1e5d8235f90a495fda",
    "userName": "deanruiz@testuser.com",
    "name": {
        "familyName": "Harris",
        "givenName": "Larry"
    },
    "active": false,
    "emails": [
        {
            "value": "gloversuzanne@testuser.com",
            "type": "work",
            "primary": true
        }
    ],
    "addresses": [
        {
            "country": "ML",
            "type": "work",
            "primary": true
        }
    ],
    "meta": {
        "resourceType": "Users",
        "location": "/scim/5171a35d82074e068ce2/Users/CEC50F265D83B4530B495FCF@5171a35d82074e068ce2"
    }
}

Benutzer löschenDelete User

AnforderungRequest

DELETE /Users/5171a35d82074e068ce2 HTTP/1.1DELETE /Users/5171a35d82074e068ce2 HTTP/1.1

AntwortResponse

HTTP/1.1 204 No ContentHTTP/1.1 204 No Content

Vorgänge für GruppenGroup Operations

  • Gruppen sollen immer mit einer leeren Mitgliederliste erstellt werden.Groups shall always be created with an empty members list.
  • Gruppen können anhand des Attributs displayName abgefragt werden.Groups can be queried by the displayName attribute.
  • Bei einer Aktualisierung der Gruppe mit PATCH-Anforderung sollte in der Antwort HTTP 204 No Content angezeigt werden.Update to the group PATCH request should yield an HTTP 204 No Content in the response. Es ist nicht ratsam, einen Text mit einer Liste aller Mitglieder zurückzugeben.Returning a body with a list of all the members isn't advisable.
  • Die Rückgabe aller Mitglieder der Gruppe muss nicht unterstützt werden.It isn't necessary to support returning all the members of the group.

Erstellen einer GruppeCreate Group

AnforderungRequest

POST /Groups HTTP/1.1POST /Groups HTTP/1.1

{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group", "http://schemas.microsoft.com/2006/11/ResourceManagement/ADSCIM/2.0/Group"],
    "externalId": "8aa1a0c0-c4c3-4bc0-b4a5-2ef676900159",
    "displayName": "displayName",
    "meta": {
        "resourceType": "Group"
    }
}
AntwortResponse

HTTP/1.1 201 CreatedHTTP/1.1 201 Created

{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],
    "id": "927fa2c08dcb4a7fae9e",
    "externalId": "8aa1a0c0-c4c3-4bc0-b4a5-2ef676900159",
    "meta": {
        "resourceType": "Group",
        "created": "2018-03-27T19:59:26.000Z",
        "lastModified": "2018-03-27T19:59:26.000Z"
        
    },
    "displayName": "displayName",
    "members": []
}

Gruppe abrufenGet Group

AnforderungRequest

GET /Groups/40734ae655284ad3abcc?excludedAttributes=members HTTP/1.1GET /Groups/40734ae655284ad3abcc?excludedAttributes=members HTTP/1.1

AntwortResponse

HTTP/1.1 200 OKHTTP/1.1 200 OK

{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],
    "id": "40734ae655284ad3abcc",
    "externalId": "60f1bb27-2e1e-402d-bcc4-ec999564a194",
    "meta": {
        "resourceType": "Group",
        "created": "2018-03-27T19:59:26.000Z",
        "lastModified": "2018-03-27T19:59:26.000Z"
    },
    "displayName": "displayName",
}

Gruppe nach „displayName“ abrufenGet Group by displayName

AnforderungRequest

GET /Groups?excludedAttributes=members&filter=displayName eq "displayName" HTTP/1.1GET /Groups?excludedAttributes=members&filter=displayName eq "displayName" HTTP/1.1

AntwortResponse

HTTP/1.1 200 OKHTTP/1.1 200 OK

{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
    "totalResults": 1,
    "Resources": [{
        "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],
        "id": "8c601452cc934a9ebef9",
        "externalId": "0db508eb-91e2-46e4-809c-30dcbda0c685",
        "meta": {
            "resourceType": "Group",
            "created": "2018-03-27T22:02:32.000Z",
            "lastModified": "2018-03-27T22:02:32.000Z",
            
        },
        "displayName": "displayName",
    }],
    "startIndex": 1,
    "itemsPerPage": 20
}

Gruppe aktualisieren [Nichtmitglieder-Attribute]Update Group [Non-member attributes]

AnforderungRequest

PATCH /Groups/fa2ce26709934589afc5 HTTP/1.1PATCH /Groups/fa2ce26709934589afc5 HTTP/1.1

{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
    "Operations": [{
        "op": "Replace",
        "path": "displayName",
        "value": "1879db59-3bdf-4490-ad68-ab880a269474updatedDisplayName"
    }]
}
AntwortResponse

HTTP/1.1 204 No ContentHTTP/1.1 204 No Content

Gruppe aktualisieren [Mitglieder hinzufügen]Update Group [Add Members]

AnforderungRequest

PATCH /Groups/a99962b9f99d4c4fac67 HTTP/1.1PATCH /Groups/a99962b9f99d4c4fac67 HTTP/1.1

{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
    "Operations": [{
        "op": "Add",
        "path": "members",
        "value": [{
            "$ref": null,
            "value": "f648f8d5ea4e4cd38e9c"
        }]
    }]
}
AntwortResponse

HTTP/1.1 204 No ContentHTTP/1.1 204 No Content

Gruppe aktualisieren [Mitglieder entfernen]Update Group [Remove Members]

AnforderungRequest

PATCH /Groups/a99962b9f99d4c4fac67 HTTP/1.1PATCH /Groups/a99962b9f99d4c4fac67 HTTP/1.1

{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
    "Operations": [{
        "op": "Remove",
        "path": "members",
        "value": [{
            "$ref": null,
            "value": "f648f8d5ea4e4cd38e9c"
        }]
    }]
}
AntwortResponse

HTTP/1.1 204 No ContentHTTP/1.1 204 No Content

Gruppe löschenDelete Group

AnforderungRequest

DELETE /Groups/cdb1ce18f65944079d37 HTTP/1.1DELETE /Groups/cdb1ce18f65944079d37 HTTP/1.1

AntwortResponse

HTTP/1.1 204 No ContentHTTP/1.1 204 No Content

SicherheitsanforderungenSecurity requirements

TLS-ProtokollversionenTLS Protocol Versions

TLS 1.2 und TLS 1.3 sind die einzigen akzeptierten TLS-Protokollversionen.The only acceptable TLS protocol versions are TLS 1.2 and TLS 1.3. Andere TLS-Versionen sind nicht zulässig.No other versions of TLS are permitted. Alle SSL-Versionen sind unzulässig.No version of SSL is permitted.

  • Die Größe von RSA-Schlüsseln muss mindestens 2.048 Bit betragen.RSA keys must be at least 2,048 bits.
  • ECC-Schlüssel müssen mindestens 256 Bit groß und mit einer genehmigten elliptischen Kurve erzeugt worden seinECC keys must be at least 256 bits, generated using an approved elliptic curve

SchlüssellängenKey Lengths

Alle Dienste müssen X.509-Zertifikate verwenden, die mit kryptografischen Schlüsseln ausreichender Länge erzeugt wurden. Das bedeutet:All services must use X.509 certificates generated using cryptographic keys of sufficient length, meaning:

VerschlüsselungssammlungenCipher Suites

Alle Dienste müssen so konfiguriert sein, dass sie die folgenden Verschlüsselungssammlungen in exakt der nachstehend angegebenen Reihenfolge verwenden.All services must be configured to use the following cipher suites, in the exact order specified below. Hinweis: Wenn Sie nur ein RSA-Zertifikat haben, sind die installierten ECDSA-Verschlüsselungssammlungen wirkungslos.Note that if you only have an RSA certificate, installed the ECDSA cipher suites do not have any effect.

TLS 1.2-Verschlüsselungssammlungen (Minimum):TLS 1.2 Cipher Suites minimum bar:

  • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384

IP-BereicheIP Ranges

Der Azure AD-Bereitstellungsdienst wird zurzeit unter den IP-Bereichen für AzureActiveDirectory betrieben, die hier aufgelistet sind.The Azure AD provisioning service currently operates under the IP Ranges for AzureActiveDirectory as listed here. Sie können die unter dem Tag AzureActiveDirectory aufgeführten IP-Adressbereiche hinzufügen, um den Datenverkehr vom Azure AD-Bereitstellungsdienst in Ihre Anwendung zuzulassen.You can add the IP ranges listed under the AzureActiveDirectory tag to allow traffic from the Azure AD provisioning service into your application. Beachten Sie, dass Sie die IP-Adressbereichsliste sorgfältig auf berechnete Adressen überprüfen müssen.Note that you will need to review the IP range list carefully for computed addresses. Eine Adresse wie 40.126.25.32 könnte in der IP-Adressbereichsliste als 40.126.0.0/18 dargestellt werden.An address such as '40.126.25.32' could be represented in the IP range list as '40.126.0.0/18'. Sie können die IP-Adressbereichsliste mithilfe der folgenden API auch programmgesteuert abrufen.You can also programatically retrieve the IP range list using the following API.

Schritt 3: Erstellen eines SCIM-EndpunktsStep 3: Build a SCIM endpoint

Nachdem Sie das Schema entworfen und die Azure AD-SCIM-Implementierung verstanden haben, können Sie mit der Entwicklung Ihres SCIM-Endpunkts beginnen.Now that you have designed your schema and understood the Azure AD SCIM implementation, you can get started developing your SCIM endpoint. Anstatt bei Null anzufangen und die Implementierung komplett selbst zu erstellen, können Sie auf eine Reihe von Open-Source-SCIM-Bibliotheken zurückgreifen, die von der SCIM-Community veröffentlicht werden.Rather than starting from scratch and building the implementation completely on your own, you can rely on a number of open source SCIM libraries published by the SCIM community.

Der Open-Source-Referenzcode für .NET Core, der vom Azure AD-Bereitstellungsteam veröffentlicht wird, ist eine solche Ressource, die Ihnen einen schnellen Einstieg in die Entwicklung ermöglicht.The open source .NET Core reference code published by the Azure AD provisioning team is one such resource that can jump start your development. Nachdem Sie den SCIM-Endpunkt erstellt haben, sollten Sie ihn testen. Sie können die Sammlung von Postman-Tests verwenden, die als Teil des Referenzcodes bereitgestellt werden, oder die oben aufgeführten Beispielanforderungen/-antworten ausführen.Once you have built your SCIM endpoint, you will want to test it out. You can use the collection of postman tests provided as part of the reference code or run through the sample requests / responses provided above.

Hinweis

Der Referenzcode soll Ihnen den Einstieg in das Erstellen des SCIM-Endpunkts erleichtern und wird in unveränderter Form zur Verfügung gestellt.The reference code is intended to help you get started building your SCIM endpoint and is provided "AS IS." Beiträge aus der Community sind stets willkommen, um den Code weiter auszubauen und zu pflegen.Contributions from the community are welcome to help build and maintain the code.

Die Lösung besteht aus zwei Projekten: Microsoft.SCIM und Microsoft.SCIM.WebHostsample.The solution is composed of two projects, Microsoft.SCIM and Microsoft.SCIM.WebHostSample.

Das Projekt Microsoft.SCIM ist eine Bibliothek und definiert die Komponenten des Webdiensts, welcher der SCIM-Spezifikation entspricht.The Microsoft.SCIM project is the library that defines the components of the web service that conforms to the SCIM specification. Er deklariert die Schnittstelle Microsoft.SCIM.IProvider. Anforderungen werden in Aufrufe der Methoden des Anbieters übersetzt, die für den Betrieb in einem Identitätsspeicher programmiert werden.It declares the interface Microsoft.SCIM.IProvider, requests are translated into calls to the provider’s methods, which would be programmed to operate on an identity store.

Aufschlüsselung: Eine Anforderung, die in Aufrufe der Methoden des Anbieters übersetzt wurde

Das Projekt Microsoft.SCIM.WebHostSample ist eine ASP.NET Core-Webanwendung von Visual Studio, die auf der leeren Vorlage basiert.The Microsoft.SCIM.WebHostSample project is a Visual Studio ASP.NET Core Web Application, based on the Empty template. Dadurch kann der Beispielcode eigenständig bereitgestellt werden und in Containern oder in Internetinformationsdiensten gehostet werden.This allows the sample code to be deployed as standalone, hosted in containers or within Internet Information Services. Implementiert wird auch die Schnittstelle Microsoft.SCIM.IProvider, die Klassen im Arbeitsspeicher als Beispielidentitätsspeicher beibehält.It also implements the Microsoft.SCIM.IProvider interface keeping classes in memory as a sample identity store.

    public class Startup
    {
        ...
        public IMonitor MonitoringBehavior { get; set; }
        public IProvider ProviderBehavior { get; set; }

        public Startup(IWebHostEnvironment env, IConfiguration configuration)
        {
            ...
            this.MonitoringBehavior = new ConsoleMonitor();
            this.ProviderBehavior = new InMemoryProvider();
        }
        ...

Erstellen eines benutzerdefinierten SCIM-EndpunktsBuilding a custom SCIM endpoint

Der SCIM-Dienst muss über eine HTTP-Adresse und über ein Serverauthentifizierungszertifikat mit einer der folgenden Stammzertifizierungsstellen verfügen:The SCIM service must have an HTTP address and server authentication certificate of which the root certification authority is one of the following names:

  • CNNICCNNIC
  • ComodoComodo
  • CyberTrustCyberTrust
  • DigiCertDigiCert
  • GeoTrustGeoTrust
  • GlobalSignGlobalSign
  • Go DaddyGo Daddy
  • VeriSignVeriSign
  • WoSignWoSign

Der .NET Core-SDK enthält ein HTTPS-Entwicklungszertifikat, das bei der Entwicklung verwendet werden kann. Dieses Zertifikat wird im Rahmen der Erstausführung installiert.The .NET Core SDK includes an HTTPS development certificate that can be used during development, the certificate is installed as part of the first-run experience. Je nach Ausführung der ASP.NET Core-Webanwendung lauscht es an einem anderen Port:Depending on how you run the ASP.NET Core Web Application it will listen to a different port:

  • Microsoft.SCIM.WebHostSample: https://localhost:5001Microsoft.SCIM.WebHostSample: https://localhost:5001
  • IIS Express: https://localhost:44359/IIS Express: https://localhost:44359/

Weitere Informationen zu HTTPS in ASP.NET Core erhalten Sie über folgenden Link: Erzwingen von HTTPS in ASP.NET CoreFor more information on HTTPS in ASP.NET Core use the following link: Enforce HTTPS in ASP.NET Core

Behandeln der EndpunktauthentifizierungHandling endpoint authentication

Anforderungen aus Azure Active Directory enthalten ein OAuth 2.0-Bearertoken.Requests from Azure Active Directory include an OAuth 2.0 bearer token. Alle Dienste, die die Anforderung empfangen, müssen den Aussteller als Azure Active Directory für den erwarteten Azure Active Directory-Mandanten authentifizieren.Any service receiving the request should authenticate the issuer as being Azure Active Directory for the expected Azure Active Directory tenant.

Im Token wird der Aussteller durch einen iss-Anspruch identifiziert (z. B. "iss":"https://sts.windows.net/cbb1a5ac-f33b-45fa-9bf5-f37db0fed422/").In the token, the issuer is identified by an iss claim, like "iss":"https://sts.windows.net/cbb1a5ac-f33b-45fa-9bf5-f37db0fed422/". In diesem Beispiel wird die Basisadresse des Anspruchswerts (https://sts.windows.net) zum Identifizieren von Azure Active Directory als Aussteller verwendet, während das Segment mit der relativen Adresse (cbb1a5ac-f33b-45fa-9bf5-f37db0fed422) ein eindeutiger Bezeichner des Azure Active Directory-Mandanten ist, für den das Token ausgestellt wurde.In this example, the base address of the claim value, https://sts.windows.net, identifies Azure Active Directory as the issuer, while the relative address segment, cbb1a5ac-f33b-45fa-9bf5-f37db0fed422, is a unique identifier of the Azure Active Directory tenant for which the token was issued.

Zielgruppe für das Token ist die Anwendungsvorlagen-ID für die Anwendung im Katalog. Jede in einem einzelnen Mandanten registrierte Anwendung empfängt mit SCIM-Anforderungen möglicherweise denselben iss-Anspruch.The audience for the token will be the application template ID for the application in the gallery, each of the applications registered in a single tenant may receive the same iss claim with SCIM requests. Die Anwendungsvorlagen-ID für alle benutzerdefinierten Apps lautet 8adf8e6e-67b2-4cf2-a259-e3dc5476c621.The application template ID for all custom apps is 8adf8e6e-67b2-4cf2-a259-e3dc5476c621. Das vom Azure AD-Bereitstellungsdienst generierte Token sollte nur für Tests verwendet werden.The token generated by the Azure AD provisioning service should only be used for testing. Es darf nicht in Produktionsumgebungen verwendet werden.It should not be used in production environments.

Im Beispielcode werden Anforderungen mit dem Microsoft.AspNetCore.Authentication.JwtBearer-Paket authentifiziert.In the sample code, requests are authenticated using the Microsoft.AspNetCore.Authentication.JwtBearer package. Mit dem folgenden Code wird erzwungen, dass Anforderungen an Endpunkte des Diensts mit dem von Azure Active Directory für einen bestimmten Mandanten ausgegebenen Bearertoken authentifiziert werden:The following code enforces that requests to any of the service’s endpoints are authenticated using the bearer token issued by Azure Active Directory for a specified tenant:

        public void ConfigureServices(IServiceCollection services)
        {
            if (_env.IsDevelopment())
            {
                ...
            }
            else
            {
                services.AddAuthentication(options =>
                {
                    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
                })
                    .AddJwtBearer(options =>
                    {
                        options.Authority = " https://sts.windows.net/cbb1a5ac-f33b-45fa-9bf5-f37db0fed422/";
                        options.Audience = "8adf8e6e-67b2-4cf2-a259-e3dc5476c621";
                        ...
                    });
            }
            ...
        }

        public void Configure(IApplicationBuilder app)
        {
            ...
            app.UseAuthentication();
            app.UseAuthorization();
            ...
       }

Ein Bearertoken ist auch zur Verwendung der bereitgestellten Postman-Tests und zum lokalen Debuggen mithilfe von „localhost“ erforderlich.A bearer token is also required to use of the provided postman tests and perform local debugging using localhost. Für den Beispielcode werden ASP.NET Core-Umgebungen verwendet, damit im Entwicklungsstadium die Authentifizierungsoptionen geändert und selbstsignierte Token verwendet werden können.The sample code uses ASP.NET Core environments to change the authentication options during development stage and enable the use a self-signed token.

Weitere Informationen zu mehreren Umgebungen in ASP.NET Core erhalten Sie über den folgenden Link: Verwenden von mehreren Umgebungen in ASP.NET CoreFor more information on multiple environments in ASP.NET Core use the following link: Use multiple environments in ASP.NET Core

Mit dem folgenden Code wird erzwungen, dass Anforderungen an Endpunkte des Diensts mit einem Bearertoken, das mit einem benutzerdefinierten Schlüssel signiert wurde, authentifiziert werden:The following code enforces that requests to any of the service’s endpoints are authenticated using a bearer token signed with a custom key:

        public void ConfigureServices(IServiceCollection services)
        {
            if (_env.IsDevelopment())
            {
                services.AddAuthentication(options =>
                {
                    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
                })
                    .AddJwtBearer(options =>
                    {
                        options.TokenValidationParameters =
                            new TokenValidationParameters
                            {
                                ValidateIssuer = false,
                                ValidateAudience = false,
                                ValidateLifetime = false,
                                ValidateIssuerSigningKey = false,
                                ValidIssuer = "Microsoft.Security.Bearer",
                                ValidAudience = "Microsoft.Security.Bearer",
                                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("A1B2C3D4E5F6A1B2C3D4E5F6"))
                            };
                    });
            }
        ...

Senden Sie eine GET-Anforderung an den Tokencontroller, um ein gültiges Bearertoken abzurufen. Die Methode GenerateJSONWebToken ist für die Erstellung eines Tokens verantwortlich, das den für die Entwicklung konfigurierten Parametern entspricht:Send a GET request to the Token controller to get a valid bearer token, the method GenerateJSONWebToken is responsible to create a token matching the parameters configured for development:

        private string GenerateJSONWebToken()
        {
            // Create token key
            SymmetricSecurityKey securityKey =
                new SymmetricSecurityKey(Encoding.UTF8.GetBytes("A1B2C3D4E5F6A1B2C3D4E5F6"));
            SigningCredentials credentials =
                new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

            // Set token expiration
            DateTime startTime = DateTime.UtcNow;
            DateTime expiryTime = startTime.AddMinutes(120);

            // Generate the token
            JwtSecurityToken token =
                new JwtSecurityToken(
                    "Microsoft.Security.Bearer",
                    "Microsoft.Security.Bearer",
                    null,
                    notBefore: startTime,
                    expires: expiryTime,
                    signingCredentials: credentials);

            string result = new JwtSecurityTokenHandler().WriteToken(token);
            return result;
        }

Vorgehensweise beim Bereitstellen und beim Aufheben der Bereitstellung von BenutzernHandling provisioning and deprovisioning of users

*Beispiel 1. Abfragen des Diensts nach einem passenden Benutzer _*Example 1. Query the service for a matching user _

Azure Active Directory fragt den Dienst nach einem Benutzer mit einem externalId-Attributwert ab, der mit dem mailNickname-Attributwert eines Benutzers in Azure AD übereinstimmt.Azure Active Directory queries the service for a user with an externalId attribute value matching the mailNickname attribute value of a user in Azure AD. Die Abfrage wird als Hypertext Transfer-Protokoll-Anforderung (HTTP-Anforderung) wie in diesem Beispiel ausgedrückt, wobei „jyoung“ ein Beispiel für ein mailNickname-Attribut eines Benutzers in Azure Active Directory ist.The query is expressed as a Hypertext Transfer Protocol (HTTP) request such as this example, wherein jyoung is a sample of a mailNickname of a user in Azure Active Directory.

Hinweis

Dies ist nur ein Beispiel.This is an example only. Nicht alle Benutzer verfügen über ein mailNickname-Attribut, und der Wert eines Benutzers ist möglicherweise im Verzeichnis nicht eindeutig.Not all users will have a mailNickname attribute, and the value a user has may not be unique in the directory. Das für den Abgleich verwendete Attribut (in diesem Fall externalId) kann auch in den Azure AD-Attributzuordnungen konfiguriert werden.Also, the attribute used for matching (which in this case is externalId) is configurable in the Azure AD attribute mappings.

GET https://.../scim/Users?filter=externalId eq jyoung HTTP/1.1
 Authorization: Bearer ...

Im Beispielcode wird die Anforderung in einen Aufruf der QueryAsync-Methode des Dienstanbieters übersetzt.In the sample code the request is translated into a call to the QueryAsync method of the service’s provider. Dies ist die Signatur dieser Methode:Here is the signature of that method:

 // System.Threading.Tasks.Tasks is defined in mscorlib.dll.  
 // Microsoft.SCIM.IRequest is defined in 
 // Microsoft.SCIM.Service.  
 // Microsoft.SCIM.Resource is defined in 
 // Microsoft.SCIM.Schemas.  
 // Microsoft.SCIM.IQueryParameters is defined in 
 // Microsoft.SCIM.Protocol.  

 Task<Resource[]> QueryAsync(IRequest<IQueryParameters> request);

In der Beispielabfrage für einen Benutzer mit einem bestimmten Wert für das Attribut externalId lauten die Werte der Argumente, die an die QueryAsync-Methode übergeben werden, wie folgt:In the sample query, for a user with a given value for the externalId attribute, values of the arguments passed to the QueryAsync method are:

_ parameters.AlternateFilters.Count: 1_ parameters.AlternateFilters.Count: 1

  • parameters.AlternateFilters.ElementAt(0).AttributePath: "externalId"parameters.AlternateFilters.ElementAt(0).AttributePath: "externalId"
  • parameters.AlternateFilters.ElementAt(0).ComparisonOperator: ComparisonOperator.Equalsparameters.AlternateFilters.ElementAt(0).ComparisonOperator: ComparisonOperator.Equals
  • parameters.AlternateFilter.ElementAt(0).ComparisonValue: "jyoung"parameters.AlternateFilter.ElementAt(0).ComparisonValue: "jyoung"

*Beispiel 2. Bereitstellen eines Benutzers _*Example 2. Provision a user _

Wenn in der Antwort auf eine Abfrage an den Webdienst für einen Benutzer mit einem externalId-Attributwert, der mit dem mailNickname-Attributwert eines Benutzers übereinstimmt, keine Benutzer zurückgegeben werden, stellt Azure Active Directory die folgende Anforderung: Der Dienst muss einen Benutzer bereitstellen, der dem Benutzer in Azure Active Directory entspricht.If the response to a query to the web service for a user with an externalId attribute value that matches the mailNickname attribute value of a user doesn't return any users, then Azure Active Directory requests that the service provision a user corresponding to the one in Azure Active Directory. Dies ist ein Beispiel für eine Anforderung dieser Art:Here is an example of such a request:

 POST https://.../scim/Users HTTP/1.1
 Authorization: Bearer ...
 Content-type: application/scim+json
 {
   "schemas":
   [
     "urn:ietf:params:scim:schemas:core:2.0:User",
     "urn:ietf:params:scim:schemas:extension:enterprise:2.0User"],
   "externalId":"jyoung",
   "userName":"jyoung",
   "active":true,
   "addresses":null,
   "displayName":"Joy Young",
   "emails": [
     {
       "type":"work",
       "value":"jyoung@Contoso.com",
       "primary":true}],
   "meta": {
     "resourceType":"User"},
    "name":{
     "familyName":"Young",
     "givenName":"Joy"},
   "phoneNumbers":null,
   "preferredLanguage":null,
   "title":null,
   "department":null,
   "manager":null}

Im Beispielcode wird die Anforderung in einen Aufruf der CreateAsync-Methode des Dienstanbieters übersetzt.In the sample code the request is translated into a call to the CreateAsync method of the service’s provider. Dies ist die Signatur dieser Methode:Here is the signature of that method:

 // System.Threading.Tasks.Tasks is defined in mscorlib.dll.  
 // Microsoft.SCIM.IRequest is defined in 
 // Microsoft.SCIM.Service.  
 // Microsoft.SCIM.Resource is defined in 
 // Microsoft.SCIM.Schemas.  

 Task<Resource> CreateAsync(IRequest<Resource> request);

In der Anforderung einer Benutzerbereitstellung entspricht der Wert des Ressourcenarguments einer Instanz der Klasse „Microsoft.SCIM.Core2EnterpriseUser“, die in der Microsoft.SCIM.Schemas-Bibliothek definiert ist.In a request to provision a user, the value of the resource argument is an instance of the Microsoft.SCIM.Core2EnterpriseUser class, defined in the Microsoft.SCIM.Schemas library. Wenn die Anforderung der Benutzerbereitstellung erfolgreich ist, soll die Implementierung der Methode eine Instanz der Klasse „Microsoft.SCIM.Core2EnterpriseUser“ zurückgeben. Dabei muss der Wert der Eigenschaft „Identifier“ auf den eindeutigen Bezeichner des neu bereitgestellten Benutzers eingestellt sein.If the request to provision the user succeeds, then the implementation of the method is expected to return an instance of the Microsoft.SCIM.Core2EnterpriseUser class, with the value of the Identifier property set to the unique identifier of the newly provisioned user.

Beispiel 3: Abfragen des aktuellen Status eines BenutzersExample 3. Query the current state of a user

Zum Aktualisieren eines Benutzers, der in einem Identitätsspeicher mit vorgelagertem SCIM vorhanden ist, geht Azure Active Directory so vor, dass der aktuelle Status dieses Benutzers vom Dienst per Anforderung abgefragt wird. Die Anforderung hierzu sieht wie folgt aus:To update a user known to exist in an identity store fronted by an SCIM, Azure Active Directory proceeds by requesting the current state of that user from the service with a request such as:

 GET ~/scim/Users/54D382A4-2050-4C03-94D1-E769F1D15682 HTTP/1.1
 Authorization: Bearer ...

Im Beispielcode wird die Anforderung in einen Aufruf der RetrieveAsync-Methode des Dienstanbieters übersetzt.In the sample code the request is translated into a call to the RetrieveAsync method of the service’s provider. Dies ist die Signatur dieser Methode:Here is the signature of that method:

 // System.Threading.Tasks.Tasks is defined in mscorlib.dll.  
 // Microsoft.SCIM.IRequest is defined in 
 // Microsoft.SCIM.Service.  
 // Microsoft.SCIM.Resource and 
 // Microsoft.SCIM.IResourceRetrievalParameters 
 // are defined in Microsoft.SCIM.Schemas 

 Task<Resource> RetrieveAsync(IRequest<IResourceRetrievalParameters> request);

Im Beispiels für eine Anforderung zum Abrufen des aktuellen Status eines Benutzers lauten die Werte der Eigenschaften des Objekts, das als Wert des parameters-Arguments angegeben wird, wie folgt:In the example of a request to retrieve the current state of a user, the values of the properties of the object provided as the value of the parameters argument are as follows:

_ Identifier: „54D382A4-2050-4C03-94D1-E769F1D15682“_ Identifier: "54D382A4-2050-4C03-94D1-E769F1D15682"

  • SchemaIdentifier: "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"SchemaIdentifier: "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"

*Beispiel 4. Abfragen des Werts eines zu aktualisierenden Referenzattributs _*Example 4. Query the value of a reference attribute to be updated _

Wenn ein Verweisattribut aktualisiert werden soll, fragt Azure Active Directory den Dienst ab, um zu ermitteln, ob der aktuelle Wert des Verweisattributs im Identitätsspeicher mit vorgelagertem Dienst bereits mit dem Wert dieses Attributs in Azure Active Directory übereinstimmt.If a reference attribute is to be updated, then Azure Active Directory queries the service to determine whether the current value of the reference attribute in the identity store fronted by the service already matches the value of that attribute in Azure Active Directory. Bei Benutzern ist das einzige Attribut, für das der aktuelle Wert auf diese Weise abgefragt wird, das manager-Attribut.For users, the only attribute of which the current value is queried in this way is the manager attribute. Dies ist ein Beispiel für eine Anforderung, mit der ermittelt wird, ob das „manager“-Attribut eines Benutzerobjekts derzeit über einen bestimmten Wert verfügt: Im Beispielcode wird die Anforderung in einen Aufruf der QueryAsync-Methode des Dienstanbieters übersetzt.Here is an example of a request to determine whether the manager attribute of a user object currently has a certain value: In the sample code the request is translated into a call to the QueryAsync method of the service’s provider. Der Wert der Eigenschaften des Objekts, das als Wert des parameters-Arguments angegeben wird, lautet wie folgt:The value of the properties of the object provided as the value of the parameters argument are as follows:

_ parameters.AlternateFilters.Count: 2_ parameters.AlternateFilters.Count: 2

  • parameters.AlternateFilters.ElementAt(x).AttributePath: „ID“parameters.AlternateFilters.ElementAt(x).AttributePath: "ID"
  • parameters.AlternateFilters.ElementAt(x).ComparisonOperator: ComparisonOperator.Equalsparameters.AlternateFilters.ElementAt(x).ComparisonOperator: ComparisonOperator.Equals
  • parameters.AlternateFilter.ElementAt(x).ComparisonValue: „54D382A4-2050-4C03-94D1-E769F1D15682“parameters.AlternateFilter.ElementAt(x).ComparisonValue: "54D382A4-2050-4C03-94D1-E769F1D15682"
  • parameters.AlternateFilters.ElementAt(y).AttributePath: "manager"parameters.AlternateFilters.ElementAt(y).AttributePath: "manager"
  • parameters.AlternateFilters.ElementAt(y).ComparisonOperator: ComparisonOperator.Equalsparameters.AlternateFilters.ElementAt(y).ComparisonOperator: ComparisonOperator.Equals
  • parameters.AlternateFilter.ElementAt(y).ComparisonValue: „2819c223-7f76-453a-919d-413861904646“parameters.AlternateFilter.ElementAt(y).ComparisonValue: "2819c223-7f76-453a-919d-413861904646"
  • parameters.RequestedAttributePaths.ElementAt(0): „ID“parameters.RequestedAttributePaths.ElementAt(0): "ID"
  • parameters.SchemaIdentifier: "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"parameters.SchemaIdentifier: "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"

Hier kann der Wert von Index x „0“ und der Wert von Index y „1“ lauten, oder der Wert von x kann „1“ und der Wert von y „0“ lauten. Dies hängt von der Reihenfolge bei den Ausdrücken des Filterabfrageparameters ab.Here, the value of the index x can be 0 and the value of the index y can be 1, or the value of x can be 1 and the value of y can be 0, depending on the order of the expressions of the filter query parameter.

*Beispiel 5. Anforderung von Azure AD an einen SCIM-Dienst zur Aktualisierung eines Benutzers _*Example 5. Request from Azure AD to an SCIM service to update a user _

Dies ist ein Beispiel für eine Anforderung von Azure Active Directory an einen SCIM-Dienst zum Aktualisieren eines Benutzers:Here is an example of a request from Azure Active Directory to an SCIM service to update a user:

  PATCH ~/scim/Users/54D382A4-2050-4C03-94D1-E769F1D15682 HTTP/1.1
  Authorization: Bearer ...
  Content-type: application/scim+json
  {
    "schemas": 
    [
      "urn:ietf:params:scim:api:messages:2.0:PatchOp"],
    "Operations":
    [
      {
        "op":"Add",
        "path":"manager",
        "value":
          [
            {
              "$ref":"http://.../scim/Users/2819c223-7f76-453a-919d-413861904646",
              "value":"2819c223-7f76-453a-919d-413861904646"}]}]}

Im Beispielcode wird die Anforderung in einen Aufruf der UpdateAsync-Methode des Dienstanbieters übersetzt.In the sample code the request is translated into a call to the UpdateAsync method of the service’s provider. Dies ist die Signatur dieser Methode:Here is the signature of that method:

 // System.Threading.Tasks.Tasks and 
 // System.Collections.Generic.IReadOnlyCollection<T>  // are defined in mscorlib.dll.  
 // Microsoft.SCIM.IRequest is defined in
 // Microsoft.SCIM.Service.
 // Microsoft.SCIM.IPatch, 
 // is defined in Microsoft.SCIM.Protocol. 

 Task UpdateAsync(IRequest<IPatch> request);

Im Beispiel für eine Anforderung zum Aktualisieren eines Benutzers verfügt das Objekt, das als Wert des patch-Arguments angegeben wird, über diese Eigenschaftswerte:In the example of a request to update a user, the object provided as the value of the patch argument has these property values:

_ ResourceIdentifier.Identifier: „54D382A4-2050-4C03-94D1-E769F1D15682“_ ResourceIdentifier.Identifier: "54D382A4-2050-4C03-94D1-E769F1D15682"

  • ResourceIdentifier.SchemaIdentifier: "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"ResourceIdentifier.SchemaIdentifier: "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"
  • (PatchRequest as PatchRequest2).Operations.Count: 1(PatchRequest as PatchRequest2).Operations.Count: 1
  • (PatchRequest as PatchRequest2).Operations.ElementAt(0).OperationName: OperationName.Add(PatchRequest as PatchRequest2).Operations.ElementAt(0).OperationName: OperationName.Add
  • (PatchRequest as PatchRequest2).Operations.ElementAt(0).Path.AttributePath: "manager"(PatchRequest as PatchRequest2).Operations.ElementAt(0).Path.AttributePath: "manager"
  • (PatchRequest as PatchRequest2).Operations.ElementAt(0).Value.Count: 1(PatchRequest as PatchRequest2).Operations.ElementAt(0).Value.Count: 1
  • (PatchRequest as PatchRequest2).Operations.ElementAt(0).Value.ElementAt(0).Reference: http://.../scim/Users/2819c223-7f76-453a-919d-413861904646(PatchRequest as PatchRequest2).Operations.ElementAt(0).Value.ElementAt(0).Reference: http://.../scim/Users/2819c223-7f76-453a-919d-413861904646
  • (PatchRequest as PatchRequest2).Operations.ElementAt(0).Value.ElementAt(0).Value: 2819c223-7f76-453a-919d-413861904646(PatchRequest as PatchRequest2).Operations.ElementAt(0).Value.ElementAt(0).Value: 2819c223-7f76-453a-919d-413861904646

*Beispiel 6. Aufheben der Bereitstellung eines Benutzers _*Example 6. Deprovision a user _

Um die Bereitstellung für einen Benutzer aus einem Identitätsspeicher mit vorgelagertem SCIM-Dienst aufzuheben, sendet Azure AD eine Anforderung der folgenden Art:To deprovision a user from an identity store fronted by an SCIM service, Azure AD sends a request such as:

  DELETE ~/scim/Users/54D382A4-2050-4C03-94D1-E769F1D15682 HTTP/1.1
  Authorization: Bearer ...

Im Beispielcode wird die Anforderung in einen Aufruf der DeleteAsync-Methode des Dienstanbieters übersetzt.In the sample code the request is translated into a call to the DeleteAsync method of the service’s provider. Dies ist die Signatur dieser Methode:Here is the signature of that method:

 // System.Threading.Tasks.Tasks is defined in mscorlib.dll.  
 // Microsoft.SCIM.IRequest is defined in 
 // Microsoft.SCIM.Service.  
 // Microsoft.SCIM.IResourceIdentifier, 
 // is defined in Microsoft.SCIM.Protocol. 

 Task DeleteAsync(IRequest<IResourceIdentifier> request);

Im Beispiel für eine Anforderung zum Aufheben der Bereitstellung eines Benutzers verfügt das Objekt, das als Wert des resourceIdentifier-Arguments angegeben wird, über diese Eigenschaftswerte:The object provided as the value of the resourceIdentifier argument has these property values in the example of a request to deprovision a user:

_ ResourceIdentifier.Identifier: „54D382A4-2050-4C03-94D1-E769F1D15682“_ ResourceIdentifier.Identifier: "54D382A4-2050-4C03-94D1-E769F1D15682"

  • ResourceIdentifier.SchemaIdentifier: "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"ResourceIdentifier.SchemaIdentifier: "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"

Schritt 4: Integrieren Ihres SCIM-Endpunkts mit dem Azure AD SCIM-ClientStep 4: Integrate your SCIM endpoint with the Azure AD SCIM client

Azure AD kann für das automatische Bereitstellen von zugewiesenen Benutzern und Gruppen für Anwendungen konfiguriert werden, die ein bestimmtes Profil des SCIM 2.0-Protokolls implementieren.Azure AD can be configured to automatically provision assigned users and groups to applications that implement a specific profile of the SCIM 2.0 protocol. Die Details des Profils sind in Schritt 2: Verstehen der Azure AD SCIM-Implementierung dokumentiert.The specifics of the profile are documented in Step 2: Understand the Azure AD SCIM implementation.

Überprüfen Sie beim Anbieter Ihrer Anwendung oder in der Dokumentation zu Ihrer Anwendung, ob diese Anforderungen voll erfüllt werden.Check with your application provider, or your application provider's documentation for statements of compatibility with these requirements.

Wichtig

Die Azure AD-SCIM-Implementierung basiert auf dem Azure AD-Benutzerbereitstellungsdienst, der auf die ständige Synchronisierung der Benutzer zwischen Azure AD und der Zielanwendung ausgelegt ist, und implementiert eine ganz bestimmte Reihe von Standardvorgängen.The Azure AD SCIM implementation is built on top of the Azure AD user provisioning service, which is designed to constantly keep users in sync between Azure AD and the target application, and implements a very specific set of standard operations. Es ist wichtig, diese Verhaltensweisen zu verstehen, um das Verhalten des Azure AD-SCIM-Clients nachvollziehen zu können.It's important to understand these behaviors to understand the behavior of the Azure AD SCIM client. Weitere Informationen finden Sie in Vorgänge während der Bereitstellung: Startzyklus und Inkrementell in Funktionsweise der Bereitstellung.For more information, see the section Provisioning cycles: Initial and incremental in How provisioning works.

Erste SchritteGetting started

Anwendungen, die das SCIM-Profil wie in diesem Artikel beschrieben erfüllen, können über das Feature „Nicht-Kataloganwendung“ im Azure AD-Anwendungskatalog mit Azure Active Directory verbunden werden.Applications that support the SCIM profile described in this article can be connected to Azure Active Directory using the "non-gallery application" feature in the Azure AD application gallery. Nachdem die Verbindung hergestellt wurde, führt Azure AD alle 40 Minuten einen Synchronisierungsprozess aus, bei dem der SCIM-Endpunkt der Anwendung auf zugewiesene Benutzer und Gruppen abgefragt wird. Entsprechend den Details der Zuweisung werden Benutzer und Gruppen dann erstellt oder geändert.Once connected, Azure AD runs a synchronization process every 40 minutes where it queries the application's SCIM endpoint for assigned users and groups, and creates or modifies them according to the assignment details.

So verbinden Sie eine Anwendung, die SCIM unterstützt:To connect an application that supports SCIM:

  1. Melden Sie sich beim Azure Active Directory-Portal an.Sign in to the Azure Active Directory portal. Beachten Sie, dass Sie auf eine kostenlose Testversion für Azure Active Directory mit P2-Lizenzen zugreifen können, indem Sie sich für das Entwicklerprogramm registrieren.Note that you can get access a free trial for Azure Active Directory with P2 licenses by signing up for the developer program

  2. Wählen Sie im linken Bereich die Option Unternehmensanwendungen aus.Select Enterprise applications from the left pane. Eine Liste mit allen konfigurierten Apps wird angezeigt, einschließlich Apps, die aus dem Katalog hinzugefügt wurden.A list of all configured apps is shown, including apps that were added from the gallery.

  3. Wählen Sie + Neue Anwendung > Alle > Nicht-Kataloganwendung.Select + New application > All > Non-gallery application.

  4. Geben Sie einen Namen für Ihre Anwendung ein, und wählen Sie Hinzufügen, um ein App-Objekt zu erstellen.Enter a name for your application, and select Add to create an app object. Die neue App wird der Liste mit den Unternehmensanwendungen hinzugefügt und mit dem App-Verwaltungsbildschirm geöffnet.The new app is added to the list of enterprise applications and opens to its app management screen.

    Screenshot des Azure AD-AnwendungskatalogsScreenshot shows the Azure AD application gallery
    Azure AD-AnwendungskatalogAzure AD application gallery

  5. Wählen Sie auf dem App-Verwaltungsbildschirm im linken Bereich die Option Bereitstellung.In the app management screen, select Provisioning in the left panel.

  6. Wählen Sie im Menü Bereitstellungsmodus die Option Automatisch aus.In the Provisioning Mode menu, select Automatic.

    Beispiel: Bereitstellungsseite einer App im Azure-PortalExample: An app's Provisioning page in the Azure portal
    Konfigurieren der Bereitstellung im Azure-PortalConfiguring provisioning in the Azure portal

  7. Geben Sie im Feld Mandanten-URL die URL des SCIM-Endpunkts der Anwendung ein.In the Tenant URL field, enter the URL of the application's SCIM endpoint. Beispiel: https://api.contoso.com/scim/Example: https://api.contoso.com/scim/

  8. Wenn der SCIM-Endpunkt ein OAuth-Bearertoken benötigt, das von einem anderen Aussteller als Azure AD stammt, kopieren Sie das erforderliche OAuth-Bearertoken in das optionale Feld Geheimes Token.If the SCIM endpoint requires an OAuth bearer token from an issuer other than Azure AD, then copy the required OAuth bearer token into the optional Secret Token field. Wird dieses Feld leer gelassen, fügt Azure AD in jede Anforderung ein von Azure AD ausgestelltes OAuth-Bearertoken ein.If this field is left blank, Azure AD includes an OAuth bearer token issued from Azure AD with each request. Apps, die Azure AD als Identitätsanbieter verwenden, können dieses von Azure AD ausgestellte Token überprüfen.Apps that use Azure AD as an identity provider can validate this Azure AD-issued token.

    Hinweis

    Es wird *nicht _ empfohlen, dieses Feld leer zu lassen und sich auf ein von Azure AD generiertes Token zu verlassen.It's *not _ recommended to leave this field blank and rely on a token generated by Azure AD. Diese Option steht in erster Linie zu Testzwecken zur Verfügung.This option is primarily available for testing purposes.

  9. Wählen Sie die Option _ *Verbindung testen**, damit Azure Active Directory versucht, eine Verbindung mit dem SCIM-Endpunkt herzustellen.Select _ Test Connection* to have Azure Active Directory attempt to connect to the SCIM endpoint. Wenn der Versuch nicht erfolgreich ist, werden Fehlerinformationen angezeigt.If the attempt fails, error information is displayed.

    Hinweis

    Die Option Verbindung testen fragt den SCIM-Endpunkt nach einem Benutzer ab, der nicht vorhanden ist, und verwendet dabei einen zufälligen global eindeutigen Bezeichner (Globally Unique Identifier, GUID) als entsprechende Eigenschaft, die in der Azure AD-Konfiguration ausgewählt wurde.Test Connection queries the SCIM endpoint for a user that doesn't exist, using a random GUID as the matching property selected in the Azure AD configuration. Die erwartete richtige Antwort ist „HTTP 200 OK“ mit einer leeren SCIM ListResponse-Meldung.The expected correct response is HTTP 200 OK with an empty SCIM ListResponse message.

  10. Wählen Sie bei einer erfolgreichen Verbindungsherstellung mit der Anwendung die Option Speichern, um die Administratoranmeldeinformationen zu speichern.If the attempts to connect to the application succeed, then select Save to save the admin credentials.

  11. Im Abschnitt Zuordnungen stehen zwei Sätze von Attributzuordnungen zur Verfügung: eine für Benutzerobjekte und eine für Gruppenobjekte.In the Mappings section, there are two selectable sets of attribute mappings: one for user objects and one for group objects. Wählen Sie beide nacheinander aus, um die Attribute zu überprüfen, die von Azure Active Directory mit Ihrer App synchronisiert werden.Select each one to review the attributes that are synchronized from Azure Active Directory to your app. Beachten Sie, dass die als übereinstimmende Eigenschaften ausgewählten Attribute für den Abgleich der Benutzer und Gruppen in Ihrer App für Updatevorgänge verwendet werden.The attributes selected as Matching properties are used to match the users and groups in your app for update operations. Wählen Sie Speichern aus, um Ihre Änderungen zu committen.Select Save to commit any changes.

    Hinweis

    Sie können die Synchronisierung von Gruppenobjekten optional deaktivieren. Deaktivieren Sie dazu die Zuordnung „Gruppen“.You can optionally disable syncing of group objects by disabling the "groups" mapping.

  12. Im Feld Bereich unter Einstellungen wird festgelegt, welche Benutzer und Gruppen synchronisiert werden.Under Settings, the Scope field defines which users and groups are synchronized. Wählen Sie Nur zugewiesene Benutzer und Gruppen synchronisieren (empfohlen) aus, damit nur Benutzer und Gruppen synchronisiert werden, die auf der Registerkarte Benutzer und Gruppen zugewiesen sind.Select Sync only assigned users and groups (recommended) to only sync users and groups assigned in the Users and groups tab.

  13. Legen Sie den Bereitstellungsstatus nach Abschluss der Konfiguration auf Ein fest.Once your configuration is complete, set the Provisioning Status to On.

  14. Wählen Sie Speichern, um den Azure AD-Bereitstellungsdienst zu starten.Select Save to start the Azure AD provisioning service.

  15. Wenn nur zugewiesene Benutzer und Gruppen synchronisiert werden (empfohlen), sollten Sie darauf achten, dass die Registerkarte Benutzer und Gruppen ausgewählt ist und die Benutzer bzw. Gruppen zugewiesen sind, die synchronisiert werden sollen.If syncing only assigned users and groups (recommended), be sure to select the Users and groups tab and assign the users or groups you want to sync.

Nachdem der erste Zyklus gestartet wurde, können Sie im linken Bereich die Option Bereitstellungsprotokolle auswählen, um den Fortschritt zu überwachen. Hier werden alle Aktionen angezeigt, die vom Bereitstellungsdienst für Ihre App durchgeführt werden.Once the initial cycle has started, you can select Provisioning logs in the left panel to monitor progress, which shows all actions done by the provisioning service on your app. Weitere Informationen zum Lesen von Azure AD-Bereitstellungsprotokollen finden Sie unter Tutorial: Meldung zur automatischen Benutzerkontobereitstellung.For more information on how to read the Azure AD provisioning logs, see Reporting on automatic user account provisioning.

Hinweis

Der erste Zyklus dauert länger als spätere Synchronisierungen, die ungefähr alle 40 Minuten erfolgen, solange der Dienst ausgeführt wird.The initial cycle takes longer to perform than later syncs, which occur approximately every 40 minutes as long as the service is running.

Wenn Sie eine Anwendung erstellen, die von mehreren Mandanten verwendet wird, können Sie sie im Azure AD-Anwendungskatalog zur Verfügung stellen.If you're building an application that will be used by more than one tenant, you can make it available in the Azure AD application gallery. Dies erleichtert Organisationen das Auffinden der Anwendung und das Konfigurieren der Bereitstellung.This will make it easy for organizations to discover the application and configure provisioning. Das Veröffentlichen Ihrer App im Azure AD-Katalog und das Verfügbarmachen der Bereitstellung für andere ist einfach.Publishing your app in the Azure AD gallery and making provisioning available to others is easy. Die entsprechenden Schritte sind hier angegeben.Check out the steps here. Microsoft wird mit Ihnen zusammenarbeiten, um Ihre Anwendung in unseren Katalog zu integrieren, Ihren Endpunkt zu testen und die Dokumentation zum Onboarding für Kunden freizugeben.Microsoft will work with you to integrate your application into our gallery, test your endpoint, and release onboarding documentation for customers to use.

Verwenden Sie die folgende Prüfliste, um ein schnelles Onboarding Ihrer Anwendung zu gewährleisten und den Kunden eine reibungslose Bereitstellung zu bieten.Follow the checklist below to ensure that your application is onboarded quicky and customers have a smooth deployment experience. Die Informationen werden beim Onboarding für den Katalog von Ihnen erfasst.The information will be gathered from you when onboarding to the gallery.

  • Unterstützung eines SCIM 2.0-Benutzer- und Gruppenendpunkts (nur einer ist erforderlich, aber beide werden empfohlen)Support a SCIM 2.0 user and group endpoint (Only one is required but both are recommended)
  • Unterstützung von mindestens 25 Anforderungen pro Sekunde und Mandant, um sicherzustellen, dass Benutzer und Gruppen ohne Verzögerung bereitgestellt werden bzw. deren Bereitstellung aufgehoben wird (erforderlich)Support at least 25 requests per second per tenant to ensure that users and groups are provisioned and deprovisioned without delay (Required)
  • Einrichtung eines Kontakts für technische und supportbezogene Fragen, um Kunden nach dem Katalogonboarding zu unterstützen (erforderlich)Establish engineering and support contacts to guide customers post gallery onboarding (Required)
  • 3 nicht ablaufende Testanmeldeinformationen für Ihre Anwendung (erforderlich)3 Non-expiring test credentials for your application (Required)
  • Unterstützung der OAuth-Autorisierungscodegenehmigung oder eines langlebigen Tokens gemäß der Beschreibung weiter unten (erforderlich)Support the OAuth authorization code grant or a long lived token as described below (Required)
  • Einrichtung einer Anlaufstelle für technische und supportbezogene Fragen, um Kunden nach dem Katalogonboarding zu unterstützen (erforderlich)Establish an engineering and support point of contact to support customers post gallery onboarding (Required)
  • Unterstützung der Aktualisierung mehrerer Gruppenmitgliedschaften mit einem einzelnen PATCH (empfohlen)Support updating multiple group memberships with a single PATCH (Recommended)
  • Öffentliche Dokumentation Ihres SCIM-Endpunkts (empfohlen)Document your SCIM endpoint publicly (Recommended)
  • Unterstützung der Schemaerkennung (empfohlen)Support schema discovery (Recommended)

Die SCIM-Spezifikation definiert kein SCIM-spezifisches Schema für die Authentifizierung und Autorisierung.The SCIM spec does not define a SCIM-specific scheme for authentication and authorization. Sie stützt sich auf die Verwendung bestehender Branchenstandards.It relies on the use of existing industry standards. Der Azure AD-Bereitstellungsclient unterstützt zwei Autorisierungsmethoden für Anwendungen im Katalog.The Azure AD provisioning client supports two authorization methods for applications in the gallery.

AutorisierungsmethodeAuthorization method VorteilePros NachteileCons SupportSupport
Benutzername und Kennwort (von Azure AD nicht empfohlen oder unterstützt)Username and password (not recommended or supported by Azure AD) Einfache ImplementierungEasy to implement Unsicher – Ihr KeNNwort ist unwichtigInsecure - Your Pa$$word doesn't matter Unterstützt von Fall zu Fall für Katalog-Apps.Supported on a case-by-case basis for gallery apps. Nicht unterstützt für Nicht-Katalog-Apps.Not supported for non-gallery apps.
Langlebiges BearertokenLong-lived bearer token Bei langlebigen Token muss kein Benutzer anwesend sein.Long-lived tokens do not require a user to be present. Admins können sie beim Einrichten der Bereitstellung leicht verwenden.They are easy for admins to use when setting up provisioning. Langlebige Token können nur schwer mit einem Administrator geteilt werden, ohne unsichere Methoden wie E-Mail zu verwenden.Long-lived tokens can be hard to share with an admin without using insecure methods such as email. Unterstützt für Katalog- und Nicht-Katalog-Apps.Supported for gallery and non-gallery apps.
OAuth-AutorisierungscodegenehmigungOAuth authorization code grant Zugriffstoken sind sehr viel kurzlebiger als Kennwörter und verfügen über einen automatischen Aktualisierungsmechanismus, den langlebige Bearertoken nicht haben.Access tokens are much shorter-lived than passwords, and have an automated refresh mechanism that long-lived bearer tokens do not have. Bei der ersten Autorisierung muss ein echter Benutzer anwesend sein, was einen gewissen Grad an Verantwortlichkeit bedeutet.A real user must be present during initial authorization, adding a level of accountability. Ein Benutzer muss anwesend sein.Requires a user to be present. Wenn der Benutzer das Unternehmen verlässt, wird das Token ungültig, und die Autorisierung muss erneut erfolgen.If the user leaves the organization, the token is invalid and authorization will need to be completed again. Wird nur für Katalog-Apps unterstützt.Supported for gallery apps, but not non-gallery apps. Sie können über die Benutzeroberfläche jedoch ein Zugriffstoken als geheimes Token für kurzfristige Testzwecke bereitstellen.However, you can provide an access token in the UI as the secret token for short term testing purposes. An der Unterstützung für Autorisierung über OAuth-Code für nicht im Katalog enthaltenen Anwendungen wird noch gearbeitet.Support for OAuth code grant on non-gallery is in our backlog.
Genehmigung von OAuth-ClientanmeldeinformationenOAuth client credentials grant Zugriffstoken sind sehr viel kurzlebiger als Kennwörter und verfügen über einen automatischen Aktualisierungsmechanismus, den langlebige Bearertoken nicht haben.Access tokens are much shorter-lived than passwords, and have an automated refresh mechanism that long-lived bearer tokens do not have. Sowohl die Autorisierungscodegenehmigung als auch die Genehmigung von Clientanmeldeinformationen gehören zum gleichen Typ Zugriffstoken. Ein Wechsel zwischen diesen beiden Methoden ist daher für die API transparent.Both the authorization code grant and the client credentials grant create the same type of access token, so moving between these methods is transparent to the API. Die Bereitstellung kann vollständig automatisiert werden. Neue Token können ohne Benutzerinteraktion und im Hintergrund angefordert werden.Provisioning can be completely automated, and new tokens can be silently requested without user interaction. Nicht unterstützt für Katalog- und Nicht-Katalog-Apps.Not supported for gallery and non-gallery apps. Diese Unterstützung befindet sich in unserem Backlog.Support is in our backlog.

Hinweis

Es wird nicht empfohlen, das Tokenfeld auf der Benutzeroberfläche der benutzerdefinierten App zur Konfiguration der Azure AD-Bereitstellung leer zu lassen.It's not recommended to leave the token field blank in the Azure AD provisioning configuration custom app UI. Das generierte Token steht in erster Linie zu Testzwecken zur Verfügung.The token generated is primarily available for testing purposes.

Ablauf der OAuth-Autorisierungscodegenehmigung: Der Bereitstellungsdienst unterstützt die Autorisierungscodegenehmigung.OAuth authorization code grant flow: The provisioning service supports the authorization code grant. Nachdem Sie Ihre Anforderung zur Veröffentlichung Ihrer App im Katalog übermittelt haben, wird unser Team mit Ihnen zusammenarbeiten, um die folgenden Informationen zu sammeln:After submitting your request for publishing your app in the gallery, our team will work with you to collect the following information:

  • URL für Autorisierung: Eine URL des Clients, um die Autorisierung des Ressourcenbesitzers über die Umleitung des Benutzer-Agents zu erhalten.Authorization URL: A URL by the client to obtain authorization from the resource owner via user-agent redirection. Der Benutzer wird zu dieser URL umgeleitet, um den Zugriff zu autorisieren.The user is redirected to this URL to authorize access. Beachten Sie, dass diese URL derzeit nicht für einzelne Mandanten konfiguriert werden kann.Note that this URL is currently not configurable per tenant.
  • URL für den Tokenaustausch: Eine URL des Clients, um eine Autorisierungsgenehmigung für ein Zugriffstoken auszutauschen, typischerweise mit Clientauthentifizierung.Token exchange URL: A URL by the client to exchange an authorization grant for an access token, typically with client authentication. Beachten Sie, dass diese URL derzeit nicht für einzelne Mandanten konfiguriert werden kann.Note that this URL is currently not configurable per tenant.
  • Client-ID: Der Autorisierungsserver stellt dem registrierten Client eine Client-ID aus, die eine eindeutige Zeichenfolge ist, die die vom Client bereitgestellten Registrierungsinformationen darstellt.Client ID: The authorization server issues the registered client a client identifier, which is a unique string representing the registration information provided by the client. Die Client-ID ist kein Geheimnis. Sie wird dem Ressourcenbesitzer verfügbar gemacht und darf nicht allein für die Clientauthentifizierung verwendet werden.The client identifier is not a secret; it is exposed to the resource owner and must not be used alone for client authentication.
  • Geheimer Clientschlüssel: Der geheime Clientschlüssel ist ein Geheimnis, das vom Autorisierungsserver generiert wird.Client secret: The client secret is a secret generated by the authorization server. Es sollte ein eindeutiger Wert sein, der nur dem Autorisierungsserver bekannt ist.It should be a unique value known only to the authorization server.

Beachten Sie, dass OAuth v1 aufgrund der Gefährdung des geheimen Clientschlüssels nicht unterstützt wird.Note that OAuth v1 is not supported due to exposure of the client secret. OAuth v2 dagegen wird unterstützt.OAuth v2 is supported.

Bewährte Methoden (empfohlen, aber nicht erforderlich):Best practices (recommended but not required):

  • Unterstützen Sie mehrere Umleitungs-URLs.Support multiple redirect URLs. Administratoren können die Bereitstellung sowohl über „portal.azure.com“ als auch über „aad.portal.azure.com“ konfigurieren.Administrators can configure provisioning from both "portal.azure.com" and "aad.portal.azure.com". Die Unterstützung mehrerer Umleitungs-URLs stellt sicher, dass Benutzer den Zugriff von beiden Portalen aus autorisieren können.Supporting multiple redirect URLs will ensure that users can authorize access from either portal.
  • Unterstützen Sie mehrere Geheimnisse, um eine reibungslose Erneuerung der Geheimnisse ohne Ausfallzeiten sicherzustellen.Support multiple secrets to ensure smooth secret renewal, without downtime.

OAuth-Autorisierungscodeflow:Steps in the OAuth code grant flow:

  1. Ein Benutzer meldet sich im Azure-Portal an und klickt auf „Unternehmensanwendungen“ > „Anwendung“ > „Bereitstellung“ > „Autorisieren“.User signs into the Azure portal > Enterprise applications > Select application > Provisioning > click authorize.
  2. Der Benutzer wird im Azure-Portal zur Autorisierungs-URL (Anmeldeseite für die Drittanbieter-App) weitergeleitet.Azure portal redirects user to the Authorization URL (sign in page for the third party app).
  3. Der Administrator stellt Anmeldeinformationen für die Drittanbieteranwendung bereit.Admin provides credentials to the third party application.
  4. Die Drittanbieter-App leitet den Benutzer zurück zum Azure-Portal und stellt den Autorisierungscode bereit.Third party app redirects user back to Azure portal and provides the grant code
  5. Der Azure AD-Bereitstellungsdienst ruft die Token-URL auf und stellt den Autorisierungscode bereit.Azure AD provisioning services calls the token URL and provides the grant code. Die Drittanbieteranwendung reagiert mit dem Zugriffstoken, dem Aktualisierungstoken und einem Ablaufdatum.The third party application responds with the access token, refresh token, and expiry date
  6. Wenn der Bereitstellungszyklus beginnt, überprüft der Dienst, ob das aktuelle Zugriffstoken gültig ist und tauscht es bei Bedarf gegen ein neues aus.When the provisioning cycle begins, the service checks if the current access token is valid and exchanges it for a new token if needed. Das Zugriffstoken wird in jeder für die App veröffentlichten Anforderung bereitgestellt, und die Gültigkeit der Anforderung wird bei jeder Anforderung überprüft.The access token is provided in each request made to the app and the validity of the request is checked before each request.

Hinweis

Aktuell ist es zwar nicht möglich, OAuth für eine Anwendung einzurichten, die nicht aus dem Katalog stammt, Sie können jedoch manuell ein Zugriffstoken auf Ihrem Autorisierungsserver generieren und in das Feld für ein geheimes Token der Anwendung einfügen, die nicht aus dem Katalog stammt.While it is not possible to setup OAuth on the non-gallery application today, you can manually generate an access token from your authorization server and input that in the secret token field of the non-gallery application. Dies ermöglicht es Ihnen, die Kompatibilität Ihres SCIM-Servers mit dem SCIM-Client in Azure AD zu überprüfen, bevor Sie ein Onboarding im App-Katalog ausführen, für den die Autorisierung über OAuth-Code unterstützt wird.This allows you to verify compatibility of your SCIM server with the Azure AD SCIM client before onboarding to the app gallery, which does support the OAuth code grant.

Langlebige OAuth-Bearertoken: Wenn Ihre Anwendung den Ablauf der OAuth-Autorisierungscodegenehmigung nicht unterstützt, können Sie auch ein langlebiges OAuth-Bearertoken generieren, mit dem ein Administrator die Integration der Bereitstellung einrichten kann.Long-lived OAuth bearer tokens: If your application does not support the OAuth authorization code grant flow, you can also generate a long lived OAuth bearer token than that an administrator can use to setup the provisioning integration. Das Token sollte unbefristet sein, andernfalls wird der Bereitstellungsauftrag nach Ablauf des Token unter Quarantäne gestellt.The token should be perpetual, or else the provisioning job will be quarantined when the token expires. Dieses Token muss eine Größe von weniger als 1 KB aufweisen.This token must be below 1KB in size.

Teilen Sie uns über UserVoice mit, wenn weitere Methoden zur Authentifizierung und Autorisierung erforderlich sind.For additional authentication and authorization methods, let us know on UserVoice.

Es empfiehlt sich, die vorhandene Dokumentation zu aktualisieren und unsere gemeinsame Integration in Ihren Marketingkanälen hervorzuheben, um über die Integration zu informieren und Interesse dafür zu wecken.To help drive awareness and demand of our joint integration, we recommend you update your existing documentation and amplify the integration in your marketing channels. Die folgende Prüfliste enthält empfohlene Aktivitäten zur Unterstützung der Einführung:The below is a set of checklist activities we recommend you complete to support the launch

  • Bereitschaft von Vertrieb und Kundensupport:Sales and customer support readiness. Stellen Sie sicher, dass Ihre Vertriebs- und Supportteams mit den Integrationsfunktionen vertraut sind und sich zu ihnen äußern können.Ensure your sales and support teams are aware and can speak to the integration capabilities. Weisen Sie Ihre Vertriebs- und Supportteams ein, stellen Sie häufig gestellte Fragen bereit, und nehmen Sie die Integration in Ihr Vertriebsmaterial auf.Brief your sales and support team, provide them with FAQs and include the integration into your sales materials.
  • Blogbeitrag und/oder Pressemitteilung:Blog post and/or press release. Erstellen Sie einen Blogbeitrag oder eine Pressemitteilung mit einer Beschreibung der gemeinsamen Integration, der Vorteile und der ersten Schritte.Craft a blog post or press release that describes the joint integration, the benefits and how to get started. Beispiel: Pressemitteilung von Imprivata und Azure Active DirectoryExample: Imprivata and Azure Active Directory Press Release
  • Soziale Medien:Social media. Nutzen Sie soziale Medien wie Twitter, Facebook oder LinkedIn, um bei Ihren Kunden für die Integration zu werben.Leverage your social media like Twitter, Facebook or LinkedIn to promote the integration to your customers. Schließen Sie @AzureAD ein, damit wir Ihren Beitrag retweeten können.Be sure to include @AzureAD so we can retweet your post. Beispiel: Twitter-Beitrag von ImprivataExample: Imprivata Twitter Post
  • Marketingwebsite:Marketing website. Erstellen oder aktualisieren Sie Ihre Marketingseiten (Integrationsseite, Partnerseite, Preisseite und Ähnliches), um die Verfügbarkeit der gemeinsamen Integration einzuschließen.Create or update your marketing pages (e.g. integration page, partner page, pricing page, etc.) to include the availability of the joint integration. Beispiel: Integrationsseite von Pingboard, Integrationsseite von Smartsheet, Preisseite von Monday.comExample: Pingboard integration Page, Smartsheet integration page, Monday.com pricing page
  • Technische Dokumentation:Technical documentation. Erstellen Sie einen Hilfecenter-Artikel oder eine technische Dokumentation mit den ersten Schritten für Kunden.Create a help center article or technical documentation on how customers can get started. Beispiel: Integration von Envoy und Microsoft Azure Active DirectoryExample: Envoy + Microsoft Azure Active Directory integration.
  • Kundenkommunikation:Customer communication. Machen Sie Kunden über Ihre Kundenkommunikationskanäle (monatliche Newsletter, E-Mail-Kampagnen, Produktanmerkungen) auf die neue Integration aufmerksam.Alert customers of the new integration through your customer communication (monthly newsletters, email campaigns, product release notes).