Skip to content

Commit 4b95b13

Browse files
authored
Merge branch 'master' into stream-analytics-troubleshoot-output
2 parents 4013654 + 1f6ff99 commit 4b95b13

File tree

1,732 files changed

+21675
-25702
lines changed

Some content is hidden

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

1,732 files changed

+21675
-25702
lines changed

.openpublishing.publish.config.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,11 @@
499499
"path_to_root": "azure-cosmosdb-java-v4-getting-started",
500500
"url": "https://github.com/Azure-Samples/azure-cosmos-java-getting-started",
501501
"branch": "master"
502+
},
503+
{
504+
"path_to_root": "azure-storage-snippets",
505+
"url": "https://github.com/azure-samples/AzureStorageSnippets",
506+
"branch": "master"
502507
}
503508
],
504509
"branch_target_mapping": {

.openpublishing.redirection.json

Lines changed: 432 additions & 2 deletions
Large diffs are not rendered by default.

articles/active-directory-b2c/claim-resolver-overview.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ manager: celestedg
99
ms.service: active-directory
1010
ms.workload: identity
1111
ms.topic: reference
12-
ms.date: 03/30/2020
12+
ms.date: 04/21/2020
1313
ms.author: mimart
1414
ms.subservice: B2C
1515
---
@@ -86,7 +86,14 @@ The following sections list available claim resolvers.
8686
| {Context:IPAddress} | The user IP address. | 11.111.111.11 |
8787
| {Context:KMSI} | Indicates whether [Keep me signed in](custom-policy-keep-me-signed-in.md) checkbox is selected. | true |
8888

89-
### Non-protocol parameters
89+
### Claims
90+
91+
| Claim | Description | Example |
92+
| ----- | ----------- | --------|
93+
| {Claim:claim type} | An identifier of a claim type already defined in the ClaimsSchema section in the policy file or parent policy file. For example: `{Claim:displayName}`, or `{Claim:objectId}`. | A claim type value.|
94+
95+
96+
### OAuth2 key-value parameters
9097

9198
Any parameter name included as part of an OIDC or OAuth2 request can be mapped to a claim in the user journey. For example, the request from the application might include a query string parameter with a name of `app_session`, `loyalty_number`, or any custom query string.
9299

@@ -114,6 +121,7 @@ Any parameter name included as part of an OIDC or OAuth2 request can be mapped t
114121
| {SAML:AllowCreate} | The `AllowCreate` attribute value, from the `NameIDPolicy` element of the SAML request. | True |
115122
| {SAML:ForceAuthn} | The `ForceAuthN` attribute value, from the `AuthnRequest` element of the SAML request. | True |
116123
| {SAML:ProviderName} | The `ProviderName` attribute value, from the `AuthnRequest` element of the SAML request.| Contoso.com |
124+
| {SAML:RelayState} | The `RelayState` query string parameter.|
117125

118126
## Using claim resolvers
119127

articles/active-directory-b2c/json-transformations.md

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ manager: celestedg
99
ms.service: active-directory
1010
ms.workload: identity
1111
ms.topic: reference
12-
ms.date: 12/10/2019
12+
ms.date: 04/21/2020
1313
ms.author: mimart
1414
ms.subservice: B2C
1515
---
@@ -219,6 +219,39 @@ In the following example, the claims transformation extracts the `id` element fr
219219
- Output claims:
220220
- **extractedClaim**: 6353399
221221

222+
## GetSingleItemFromJson
223+
224+
Gets the first element from a JSON data.
225+
226+
| Item | TransformationClaimType | Data Type | Notes |
227+
| ---- | ----------------------- | --------- | ----- |
228+
| InputClaim | inputJson | string | The ClaimTypes that are used by the claims transformation to get the item from the JSON data. |
229+
| OutputClaim | key | string | The first element key in the JSON. |
230+
| OutputClaim | value | string | The first element value in the JSON. |
231+
232+
In the following example, the claims transformation extracts the first element (given name) from the JSON data.
233+
234+
```XML
235+
<ClaimsTransformation Id="GetGivenNameFromResponse" TransformationMethod="GetSingleItemFromJson">
236+
<InputClaims>
237+
<InputClaim ClaimTypeReferenceId="json" TransformationClaimType="inputJson" />
238+
</InputClaims>
239+
<OutputClaims>
240+
<OutputClaim ClaimTypeReferenceId="givenNameKey" TransformationClaimType="key" />
241+
<OutputClaim ClaimTypeReferenceId="givenName" TransformationClaimType="value" />
242+
</OutputClaims>
243+
</ClaimsTransformation>
244+
```
245+
246+
### Example
247+
248+
- Input claims:
249+
- **inputJson**: {"givenName": "Emilty", "lastName": "Smith"}
250+
- Output claims:
251+
- **key**: givenName
252+
- **value**: Emilty
253+
254+
222255
## GetSingleValueFromJsonArray
223256

224257
Gets the first element from a JSON data array.
@@ -290,3 +323,5 @@ Output claim:
290323
}
291324
}
292325
```
326+
327+

articles/active-directory-b2c/string-transformations.md

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ manager: celestedg
99
ms.service: active-directory
1010
ms.workload: identity
1111
ms.topic: reference
12-
ms.date: 03/16/2020
12+
ms.date: 04/21/2020
1313
ms.author: mimart
1414
ms.subservice: B2C
1515
---
@@ -365,7 +365,7 @@ Copies localized strings into claims.
365365

366366
| Item | TransformationClaimType | Data Type | Notes |
367367
| ---- | ----------------------- | --------- | ----- |
368-
| OutputClaim | The name of the localized string | string | List of claim types that is produced after this claims transformation has been invoked. |
368+
| OutputClaim | The name of the localized string | string | List of claim types that are produced after this claims transformation has been invoked. |
369369

370370
To use the GetLocalizedStringsTransformation claims transformation:
371371

@@ -611,13 +611,17 @@ Checks that a string claim `claimToMatch` and `matchTo` input parameter are equa
611611
| inputClaim | claimToMatch | string | The claim type, which is to be compared. |
612612
| InputParameter | matchTo | string | The regular expression to match. |
613613
| InputParameter | outputClaimIfMatched | string | The value to be set if strings are equal. |
614+
| InputParameter | extractGroups | boolean | [Optional] Specifies whether the Regex match should extract groups values. Possible values: `true`, or `false` (default). |
614615
| OutputClaim | outputClaim | string | If regular expression is match, this output claim contains the value of `outputClaimIfMatched` input parameter. Or null, if no match. |
615616
| OutputClaim | regexCompareResultClaim | boolean | The regular expression match result output claim type, which is to be set as `true` or `false` based on the result of matching. |
617+
| OutputClaim| The name of the claim| string | If the extractGroups input parameter set to true, list of claim types that are produced after this claims transformation has been invoked. The name of the claimType must match the Regex group name. |
616618

617-
For example, checks whether the provided phone number is valid, based on phone number regular expression pattern.
619+
### Example 1
620+
621+
Checks whether the provided phone number is valid, based on phone number regular expression pattern.
618622

619623
```XML
620-
<ClaimsTransformation Id="SetIsPhoneRegex" TransformationMethod="setClaimsIfRegexMatch">
624+
<ClaimsTransformation Id="SetIsPhoneRegex" TransformationMethod="SetClaimsIfRegexMatch">
621625
<InputClaims>
622626
<InputClaim ClaimTypeReferenceId="phone" TransformationClaimType="claimToMatch" />
623627
</InputClaims>
@@ -632,8 +636,6 @@ For example, checks whether the provided phone number is valid, based on phone n
632636
</ClaimsTransformation>
633637
```
634638

635-
### Example
636-
637639
- Input claims:
638640
- **claimToMatch**: "64854114520"
639641
- Input parameters:
@@ -643,6 +645,39 @@ For example, checks whether the provided phone number is valid, based on phone n
643645
- **outputClaim**: "isPhone"
644646
- **regexCompareResultClaim**: true
645647

648+
### Example 2
649+
650+
Checks whether the provided email address is valid, and return the email alias.
651+
652+
```XML
653+
<ClaimsTransformation Id="GetAliasFromEmail" TransformationMethod="SetClaimsIfRegexMatch">
654+
<InputClaims>
655+
<InputClaim ClaimTypeReferenceId="email" TransformationClaimType="claimToMatch" />
656+
</InputClaims>
657+
<InputParameters>
658+
<InputParameter Id="matchTo" DataType="string" Value="(?&lt;mailAlias&gt;.*)@(.*)$" />
659+
<InputParameter Id="outputClaimIfMatched" DataType="string" Value="isEmail" />
660+
<InputParameter Id="extractGroups" DataType="boolean" Value="true" />
661+
</InputParameters>
662+
<OutputClaims>
663+
<OutputClaim ClaimTypeReferenceId="validationResult" TransformationClaimType="outputClaim" />
664+
<OutputClaim ClaimTypeReferenceId="isEmailString" TransformationClaimType="regexCompareResultClaim" />
665+
<OutputClaim ClaimTypeReferenceId="mailAlias" />
666+
</OutputClaims>
667+
</ClaimsTransformation>
668+
```
669+
670+
- Input claims:
671+
- **claimToMatch**: "[email protected]"
672+
- Input parameters:
673+
- **matchTo**: `(?&lt;mailAlias&gt;.*)@(.*)$`
674+
- **outputClaimIfMatched**: "isEmail"
675+
- **extractGroups**: true
676+
- Output claims:
677+
- **outputClaim**: "isEmail"
678+
- **regexCompareResultClaim**: true
679+
- **mailAlias**: emily
680+
646681
## SetClaimsIfStringsAreEqual
647682

648683
Checks that a string claim and `matchTo` input parameter are equal, and sets the output claims with the value present in `stringMatchMsg` and `stringMatchMsgCode` input parameters, along with compare result output claim, which is to be set as `true` or `false` based on the result of comparison.

articles/active-directory-b2c/stringcollection-transformations.md

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ manager: celestedg
99
ms.service: active-directory
1010
ms.workload: identity
1111
ms.topic: reference
12-
ms.date: 02/27/2020
12+
ms.date: 04/21/2020
1313
ms.author: mimart
1414
ms.subservice: B2C
1515
---
@@ -155,4 +155,38 @@ Following example checks whether the `roles` stringCollection claim type contain
155155
- Output claims:
156156
- **outputClaim**: "true"
157157

158+
## StringCollectionContainsClaim
158159

160+
Checks if a StringCollection claim type contains a claim value.
161+
162+
| Item | TransformationClaimType | Data Type | Notes |
163+
| ---- | ----------------------- | --------- | ----- |
164+
| InputClaim | collection | stringCollection | The claim type which is to be searched. |
165+
| InputClaim | item|string| The claim type that contains the value to search.|
166+
|InputParameter|ignoreCase|string|Specifies whether this comparison should ignore the case of the strings being compared.|
167+
| OutputClaim | outputClaim | boolean | The ClaimType that is produced after this ClaimsTransformation has been invoked. A boolean indicator if the collection contains such a string |
168+
169+
Following example checks whether the `roles` stringCollection claim type contains the value of the `role` claim type.
170+
171+
```XML
172+
<ClaimsTransformation Id="HasRequiredRole" TransformationMethod="StringCollectionContainsClaim">
173+
<InputClaims>
174+
<InputClaim ClaimTypeReferenceId="roles" TransformationClaimType="collection" />
175+
<InputClaim ClaimTypeReferenceId="role" TransformationClaimType="item" />
176+
</InputClaims>
177+
<InputParameters>
178+
<InputParameter Id="ignoreCase" DataType="string" Value="true" />
179+
</InputParameters>
180+
<OutputClaims>
181+
<OutputClaim ClaimTypeReferenceId="hasAccess" TransformationClaimType="outputClaim" />
182+
</OutputClaims>
183+
</ClaimsTransformation>
184+
```
185+
186+
- Input claims:
187+
- **collection**: ["reader", "author", "admin"]
188+
- **item**: "Admin"
189+
- Input parameters:
190+
- **ignoreCase**: "true"
191+
- Output claims:
192+
- **outputClaim**: "true"

articles/active-directory-domain-services/secure-remote-vm-access.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ The RD environment deployment contains a number of steps. The existing RD deploy
5757

5858
1. Sign in to VMs created for the RD environment with an account that's part of the *Azure AD DC Administrators* group, such as *contosoadmin*.
5959
1. To create and configure RDS, use the existing [Remote Desktop environment deployment guide][deploy-remote-desktop]. Distribute the RD server components across your Azure VMs as desired.
60+
* Specific to Azure AD DS - when you configure RD licensing, set it to **Per Device** mode, not **Per User** as noted in the deployment guide.
6061
1. If you want to provide access using a web browser, [set up the Remote Desktop web client for your users][rd-web-client].
6162

6263
With RD deployed into the Azure AD DS managed domain, you can manage and use the service as you would with an on-premises AD DS domain.

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)

0 commit comments

Comments
 (0)