Skip to content

Commit b194c80

Browse files
committed
Merge branch 'master' of https://github.com/MicrosoftDocs/azure-docs-pr into release-marmalade
2 parents 0f2958f + be12f22 commit b194c80

File tree

240 files changed

+1179
-1206
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

240 files changed

+1179
-1206
lines changed

articles/active-directory/app-provisioning/functions-for-customizing-application-data.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -519,11 +519,11 @@ SelectUniqueValue(uniqueValueRule1, uniqueValueRule2, uniqueValueRule3, …)
519519
**Description:**<br>
520520
Requires a minimum of two arguments, which are unique value generation rules defined using expressions. The function evaluates each rule and then checks the value generated for uniqueness in the target app/directory. The first unique value found will be the one returned. If all of the values already exist in the target, the entry will get escrowed and the reason gets logged in the audit logs. There is no upper bound to the number of arguments that can be provided.
521521

522-
> [!NOTE]
523-
> - This is a top-level function, it cannot be nested.
524-
> - This function cannot be applied to attributes that have a matching precedence.
525-
> - This function is only meant to be used for entry creations. When using it with an attribute, set the **Apply Mapping** property to **Only during object creation**.
526-
> - This function is currently only supported for "Workday to Active Directory User Provisioning". It cannot be used with other provisioning applications.
522+
523+
- This is a top-level function, it cannot be nested.
524+
- This function cannot be applied to attributes that have a matching precedence.
525+
- This function is only meant to be used for entry creations. When using it with an attribute, set the **Apply Mapping** property to **Only during object creation**.
526+
- This function is currently only supported for "Workday to Active Directory User Provisioning". It cannot be used with other provisioning applications.
527527

528528

529529
**Parameters:**<br>
68 KB
Loading
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
---
2+
title: Using SCIM, the Microsoft Graph, and the Azure AD provisioning service to provision users and enrich your application with the data it needs | Microsoft Docs
3+
description: Using SCIM and the Microsoft Graph together to provision users and enrich your application with the data it needs .
4+
services: active-directory
5+
documentationcenter: ''
6+
author: msmimart
7+
manager: CelesteDG
8+
9+
ms.assetid:
10+
ms.service: active-directory
11+
ms.subservice: app-provisioning
12+
ms.workload: identity
13+
ms.tgt_pltfrm: na
14+
ms.devlang: na
15+
ms.topic: conceptual
16+
ms.date: 04/06/2020
17+
ms.author: mimart
18+
ms.reviewer: arvinh
19+
20+
ms.collection: M365-identity-device-management
21+
---
22+
23+
24+
# Using SCIM and Microsoft Graph together to provision users and enrich your application with the data it needs
25+
26+
**Target audience:** This document is targeted towards developers building applications integrated with Azure AD. For others looking to integrate an existing application such as Zoom, ServiceNow, and DropBox you can skip this and review the application specific [tutorials](https://docs.microsoft.com/azure/active-directory/saas-apps/tutorial-list).
27+
28+
**Common scenarios**
29+
30+
> [!div class="checklist"]
31+
> * Automatically create users in my application
32+
> * Automatically remove users from my application when they shouldn't have access anymore
33+
> * Integrate my application with multiple identity providers for provisioning
34+
> * Enrich my application with data from Microsoft services such as Sharepoint, Outlook, and Office.
35+
> * Automatically create, update, and delete users and groups in Azure AD and Active Directory
36+
37+
![SCIM Graph decision tree](./media/user-provisioning/scim-graph.png)
38+
39+
## Scenario 1: Automatically create users in my app
40+
Today, IT admins manually create user accounts in my application each time someone needs access or periodically upload CSV files. The process is time consuming for customers and slows down adoption of my application. All I need is basic [user](https://docs.microsoft.com/graph/api/resources/user?view=graph-rest-1.0) information such as name, email, and userPrincipalName to create a user. Furthermore, my customers use various IdPs and I don't have the resources to maintain a sync engine and custom integrations with each IdP.
41+
42+
**Recommendation**: Support a SCIM compliant [/Users](https://aka.ms/scimreferencecode) endpoint. Your customers will be able to easily use this endpoint to integrate with the Azure AD provisioning service and automatically create user accounts when they need access. You can build the endpoint once and it will be compatible with all IdPs, without having to maintain a sync engine. Check out the example request below for how a user would be created.
43+
44+
```json
45+
POST /Users
46+
{
47+
"schemas": [
48+
"urn:ietf:params:scim:schemas:core:2.0:User",
49+
"urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"],
50+
"externalId": "0a21f0f2-8d2a-4f8e-bf98-7363c4aed4ef",
51+
"userName": "BillG",
52+
"active": true,
53+
"meta": {
54+
"resourceType": "User"
55+
},
56+
"name": {
57+
"formatted": "Bill Gates",
58+
"familyName": "Gates",
59+
"givenName": "Bill"
60+
},
61+
"roles": []
62+
}
63+
```
64+
65+
## Scenario 2: Automatically remove users from my app
66+
The customers using my application are security focused and have governance requirements to remove accounts when employees don't need them anymore. How can I automate deprovisioning from my application?
67+
68+
**Recommendation:** Support a SCIM compliant /Users endpoint. The Azure AD provisioning service will send requests to disable and delete when the user shouldn't have access anymore. We recommend supporting both disabling and deleting users. See the examples below for what a disable and delete request look like.
69+
70+
Disable user
71+
```json
72+
PATCH /Users/5171a35d82074e068ce2 HTTP/1.1
73+
{
74+
"Operations": [
75+
{
76+
"op": "Replace",
77+
"path": "active",
78+
"value": false
79+
}
80+
],
81+
"schemas": [
82+
"urn:ietf:params:scim:api:messages:2.0:PatchOp"
83+
]
84+
}
85+
```
86+
Delete user
87+
```json
88+
DELETE /Users/5171a35d82074e068ce2 HTTP/1.1
89+
```
90+
91+
## Scenario 3: Automate managing group memberships in my app
92+
My application relies on groups for access to various resources, and customers want to reuse the groups that they have in Azure AD. How can I import groups from Azure AD and keep them updated as the memberships change?
93+
94+
**Recommendation:** Support a SCIM compliant /Groups [endpoint](https://aka.ms/scimreferencecode). The Azure AD provisioning service will take care of creating groups and managing membership updates in your application.
95+
96+
## Scenario 4: Enrich my app with data from Microsoft services such as Teams, Outlook, and OneDrive.
97+
My application is built into Microsoft Teams and relies on message data. In addition, we store files for users in OneDrive. How can I enrich my application with the data from these services and across Microsoft?
98+
99+
**Recommendation:** The [Microsoft Graph](https://docs.microsoft.com/graph/) is your entry point to access Microsoft data. Each workload exposes APIs with the data that you need. The Microsoft graph can be used along with [SCIM provisioning](https://docs.microsoft.com/azure/active-directory/app-provisioning/use-scim-to-provision-users-and-groups) for the scenarios above. You can use SCIM to provision basic user attributes into your application while calling into graph to get any other data that you need.
100+
101+
## Scenario 5: Track changes in Microsoft services such as Teams, Outlook, and Azure AD.
102+
I need to be able to track changes to Teams and Outlook messages and react to them in real time. How can I get these changes pushed to my application?
103+
104+
**Recommendation:** The Microsoft Graph provides [change notifications](https://docs.microsoft.com/graph/webhooks) and change tracking for various resources. Note the following limitations of change notifications:
105+
- If an event receiver acknowledges an event, but fails to act on it for any reason, the event may be lost
106+
- If an event receiver acknowledges an event, but fails to act on it for any reason, the event may be lost
107+
- Change notifications don't always contain the [resource data](https://docs.microsoft.com/graph/webhooks-with-resource-data)
108+
For the reasons above, developers often use change notifications along with change tracking for synchronization scenarios.
109+
110+
## Scenario 6: Provision users and groups in Azure AD.
111+
My application creates information about a user that customers need in Azure AD. This could be an HR application than manages hiring, a communications app that creates phone numbers for users, or some other app that generates data that would be valuable in Azure AD. How do I populate the user record in Azure AD with that data?
112+
113+
**Recommendation** The Microsoft graph exposes /Users and /Groups endpoints that you can integrate with today to provision users into Azure AD. Please note that Azure Active Directory doesn't support writing those users back into Active Directory.
114+
115+
> [!NOTE]
116+
> Microsoft has a provisioning service that pulls in data from HR applications such as Workday and SuccessFactors. These integrations are built and managed by Microsoft. For onboarding a new HR application to our service, you can request it on [UserVoice](https://feedback.azure.com/forums/374982-azure-active-directory-application-requests).
117+
118+
## Related articles
119+
120+
- [Review the synchronization Microsoft Graph documentation](https://docs.microsoft.com/graph/api/resources/synchronization-overview?view=graph-rest-beta)
121+
- [Integrating a custom SCIM app with Azure AD](use-scim-to-provision-users-and-groups.md)

articles/active-directory/app-provisioning/toc.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@
7979
items:
8080
- name: SCIM 2.0 protocol compliance
8181
href: application-provisioning-config-problem-scim-compatibility.md
82+
- name: SCIM and Graph scenarios
83+
href: scim-graph-scenarios.md
8284
- name: Choose a provisioning method
8385
href: isv-automatic-provisioning-multi-tenant-apps.md
8486
- name: Cloud HR provisioning
@@ -106,4 +108,4 @@
106108
- name: Stack Overflow
107109
href: https://stackoverflow.com/questions/tagged/azure-active-directory
108110
- name: Videos
109-
href: https://azure.microsoft.com/documentation/videos/index/?services=active-directory
111+
href: https://azure.microsoft.com/documentation/videos/index/?services=active-directory

articles/active-directory/develop/scenario-daemon-acquire-token.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ If you don't yet have a library for your chosen language, you might want to use
172172

173173
#### First case: Access the token request by using a shared secret
174174

175-
```Text
175+
```HTTP
176176
POST /{tenant}/oauth2/v2.0/token HTTP/1.1 //Line breaks for clarity.
177177
Host: login.microsoftonline.com
178178
Content-Type: application/x-www-form-urlencoded
@@ -185,7 +185,7 @@ client_id=535fb089-9ff3-47b6-9bfb-4f1264799865
185185

186186
#### Second case: Access the token request by using a certificate
187187

188-
```Text
188+
```HTTP
189189
POST /{tenant}/oauth2/v2.0/token HTTP/1.1 // Line breaks for clarity.
190190
Host: login.microsoftonline.com
191191
Content-Type: application/x-www-form-urlencoded
@@ -215,7 +215,7 @@ If you get an error message telling you that you used an invalid scope, you prob
215215
If you get an **Insufficient privileges to complete the operation** error when you call the API, the tenant administrator needs to grant permissions to the application. See step 6 of Register the client app above.
216216
You'll typically see an error that looks like this error:
217217

218-
```JSon
218+
```json
219219
Failed to call the web API: Forbidden
220220
Content: {
221221
"error": {

articles/active-directory/develop/scenario-daemon-app-configuration.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ The configuration file defines:
5858

5959
[appsettings.json](https://github.com/Azure-Samples/active-directory-dotnetcore-daemon-v2/blob/master/1-Call-MSGraph/daemon-console/appsettings.json) from the [.NET Core console daemon](https://github.com/Azure-Samples/active-directory-dotnetcore-daemon-v2) sample.
6060

61-
```JSon
61+
```json
6262
{
6363
"Instance": "https://login.microsoftonline.com/{0}",
6464
"Tenant": "[Enter here the tenantID or domain name for your Azure AD tenant]",

articles/active-directory/develop/scenario-desktop-app-configuration.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ To learn more about how to configure an MSAL.NET desktop application:
111111

112112
Imagine a .NET Core console application that has the following `appsettings.json` configuration file:
113113

114-
```JSon
114+
```json
115115
{
116116
"Authentication": {
117117
"AzureCloudInstance": "AzurePublic",
@@ -213,7 +213,7 @@ Objective-C:
213213
```objc
214214
NSError *msalError = nil;
215215

216-
MSALPublicClientApplicationConfig *config = [[MSALPublicClientApplicationConfig alloc] initWithClientId:@"<your-client-id-here>"];
216+
MSALPublicClientApplicationConfig *config = [[MSALPublicClientApplicationConfig alloc] initWithClientId:@"<your-client-id-here>"];
217217
MSALPublicClientApplication *application = [[MSALPublicClientApplication alloc] initWithConfiguration:config error:&msalError];
218218
```
219219

articles/active-directory/develop/scenario-mobile-acquire-token.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ When you use the protocol to get tokens for mobile apps, make two requests:
265265

266266
#### Get an authorization code
267267

268-
```Text
268+
```
269269
https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
270270
client_id=<CLIENT_ID>
271271
&response_type=code
@@ -277,7 +277,7 @@ client_id=<CLIENT_ID>
277277

278278
#### Get access and refresh the token
279279

280-
```Text
280+
```HTTP
281281
POST /{tenant}/oauth2/v2.0/token HTTP/1.1
282282
Host: https://login.microsoftonline.com
283283
Content-Type: application/x-www-form-urlencoded

articles/active-directory/develop/scenario-protected-web-api-app-registration.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ To expose application permissions, you need to edit the manifest.
105105

106106
The following sample shows the contents of `appRoles`, where the value of `id` can be any unique GUID.
107107

108-
```JSon
108+
```json
109109
"appRoles": [
110110
{
111111
"allowedMemberTypes": [ "Application" ],

articles/active-directory/develop/scenario-web-app-call-api-call-api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ Now that you have a token, you can call a protected web API.
2323

2424
Here's simplified code for the action of the `HomeController`. This code gets a token to call Microsoft Graph. Code has been added to show how to call Microsoft Graph as a REST API. The URL for the Microsoft Graph API is provided in the appsettings.json file and is read in a variable named `webOptions`:
2525

26-
```JSon
26+
```json
2727
{
2828
"AzureAd": {
2929
"Instance": "https://login.microsoftonline.com/",

0 commit comments

Comments
 (0)