Skip to content

Commit 81c2958

Browse files
committed
Merge branch 'main' into DTBC-chrisda
2 parents 8324f5c + afa7ab2 commit 81c2958

File tree

70 files changed

+1984
-290
lines changed

Some content is hidden

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

70 files changed

+1984
-290
lines changed

exchange/docs-conceptual/app-only-auth-powershell-v2.md

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ title: App-only authentication in Exchange Online PowerShell and Security & Comp
33
ms.author: chrisda
44
author: chrisda
55
manager: dansimp
6-
ms.date: 5/3/2023
6+
ms.date: 6/19/2023
77
ms.audience: Admin
88
audience: Admin
99
ms.topic: article
@@ -14,12 +14,12 @@ ms.collection: Strat_EX_Admin
1414
ms.custom:
1515
ms.assetid:
1616
search.appverid: MET150
17-
description: "Learn about using the Exchange Online PowerShell V2 module and V3 module in scripts and other long-running tasks with modern authentication and app-only authentication (also known a certificate based authentication or CBA)."
17+
description: "Learn how to configure app-only authentication (also known as certificate based authentication or CBA) using the Exchange Online PowerShell V3 module in scripts and other long-running tasks."
1818
---
1919

2020
# App-only authentication for unattended scripts in Exchange Online PowerShell and Security & Compliance PowerShell
2121

22-
Auditing and reporting scenarios in Microsoft 365 often involve unattended scripts in Exchange Online PowerShell and Security & Compliance PowerShell. In the past, unattended sign in required you to store the username and password in a local file or in a secret vault that's accessed at run-time. But, as we all know, storing user credentials locally is not a good security practice.
22+
Auditing and reporting scenarios in Microsoft 365 often involve unattended scripts in Exchange Online PowerShell and Security & Compliance PowerShell. In the past, unattended sign in required you to store the username and password in a local file or in a secret vault that's accessed at run-time. But, as we all know, storing user credentials locally isn't a good security practice.
2323

2424
Certificate based authentication (CBA) or app-only authentication as described in this article supports unattended script and automation scenarios by using Azure AD apps and self-signed certificates.
2525

@@ -49,7 +49,7 @@ Certificate based authentication (CBA) or app-only authentication as described i
4949
5050
## How does it work?
5151

52-
The Exchange Online PowerShell module uses the Active Directory Authentication Library to fetch an app-only token using the application Id, tenant Id (organization), and certificate thumbprint. The application object provisioned inside Azure AD has a Directory Role assigned to it, which is returned in the access token. The session's role based access control (RBAC) is configured using the directory role information that's available in the token.
52+
The Exchange Online PowerShell module uses the Active Directory Authentication Library to fetch an app-only token using the application ID, tenant ID (organization), and certificate thumbprint. The application object provisioned inside Azure AD has a Directory Role assigned to it, which is returned in the access token. The session's role based access control (RBAC) is configured using the directory role information that's available in the token.
5353

5454
## Connection examples
5555

@@ -60,9 +60,7 @@ The following examples show how to use the Exchange Online PowerShell module wit
6060
>
6161
> The following connection commands have many of the same options available as described in [Connect to Exchange Online PowerShell](connect-to-exchange-online-powershell.md) and [Connect to Security & Compliance PowerShell](connect-to-scc-powershell.md). For example:
6262
>
63-
> - You can use REST API cmdlets or original remote PowerShell cmdlets. For more information, see [Updates for the EXO V3 module)](exchange-online-powershell-v2.md#updates-for-the-exo-v3-module).
64-
>
65-
> Remote PowerShell support in Exchange Online PowerShell will be deprecated. For more information, see [Announcing Deprecation of Remote PowerShell (RPS) Protocol in Exchange Online PowerShell](https://aka.ms/RPSDeprecation).
63+
> Remote PowerShell support in Exchange Online PowerShell will be deprecated. For more information, see [Announcing Deprecation of Remote PowerShell (RPS) Protocol in Exchange Online PowerShell](https://aka.ms/RPSDeprecation).
6664
>
6765
> - Microsoft 365 GCC High or Microsoft 365 DoD environments require the following additional parameters and values:
6866
> - **Connect-ExchangeOnline in GCC High**: `-ExchangeEnvironmentName O365USGovGCCHigh`.
@@ -93,7 +91,7 @@ The following examples show how to use the Exchange Online PowerShell module wit
9391
9492
- **Connect using a certificate object**:
9593
96-
The certificate does not need to be installed on the computer where you're running the command. You can store the certificate object remotely. The certificate is fetched when the script is run.
94+
The certificate doesn't need to be installed on the computer where you're running the command. You can store the certificate object remotely. The certificate is fetched when the script is run.
9795
9896
- <u>Exchange Online PowerShell</u>:
9997
@@ -126,7 +124,7 @@ The following examples show how to use the Exchange Online PowerShell module wit
126124
127125
## Set up app-only authentication
128126
129-
An initial onboarding is required for authentication using application objects. Application and service principal are used interchangeably, but an application is like a class object while a service principal is like an instance of the class. You can learn more about this at [Application and service principal objects in Azure Active Directory](/azure/active-directory/develop/app-objects-and-service-principals).
127+
An initial onboarding is required for authentication using application objects. Application and service principal are used interchangeably, but an application is like a class object while a service principal is like an instance of the class. For more information, see [Application and service principal objects in Azure Active Directory](/azure/active-directory/develop/app-objects-and-service-principals).
130128
131129
For a detailed visual flow about creating applications in Azure AD, see <https://aka.ms/azuread-app>.
132130
@@ -140,9 +138,9 @@ For a detailed visual flow about creating applications in Azure AD, see <https:/
140138
141139
- For app-only authentication in Azure AD, you typically use a certificate to request access. Anyone who has the certificate and its private key can use the app, and the permissions granted to the app.
142140
143-
- Create and configure a self-signed X.509 certificate, which will be used to authenticate your Application against Azure AD, while requesting the app-only access token.
141+
- Create and configure a self-signed X.509 certificate, which is used to authenticate your Application against Azure AD, while requesting the app-only access token.
144142
145-
- This is similar to generating a password for user accounts. The certificate can be self-signed as well. See the [Appendix](#step-3-generate-a-self-signed-certificate) section later in this article for instructions for generating certificates in PowerShell.
143+
- This procedure is similar to generating a password for user accounts. The certificate can be self-signed as well. See the [Appendix](#step-3-generate-a-self-signed-certificate) section later in this article for instructions for generating certificates in PowerShell.
146144
147145
> [!NOTE]
148146
> Cryptography: Next Generation (CNG) certificates are not supported for app-only authentication with Exchange. CNG certificates are created by default in modern Windows versions. You must use a certificate from a CSP key provider. The [Appendix](#step-3-generate-a-self-signed-certificate) section covers two supported methods to create a CSP certificate.
@@ -166,7 +164,7 @@ For a detailed visual flow about creating applications in Azure AD, see <https:/
166164
167165
Or, to go directly to the **App registrations** page, use <https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade>.
168166
169-
3. On the **App registrations** page, click **New registration**.
167+
3. On the **App registrations** page, select **New registration**.
170168
171169
![Select New registration on the App registrations page.](media/exo-app-only-auth-new-app-registration.png)
172170
@@ -186,7 +184,7 @@ For a detailed visual flow about creating applications in Azure AD, see <https:/
186184
187185
![Register an application.](media/exo-app-only-auth-register-app.png)
188186
189-
When you're finished, click **Register**.
187+
When you're finished on the **App registrations** page, select **Register**.
190188
191189
4. Leave the app page that you return to open. You'll use it in the next step.
192190
@@ -234,9 +232,9 @@ For a detailed visual flow about creating applications in Azure AD, see <https:/
234232
> ],
235233
> ```
236234
237-
When you're finished, click **Save**.
235+
When you're finished on the **Manifest** page, select **Save**.
238236
239-
3. Still on the **Manifest** page, under **Management**, select **API permissions**.
237+
3. Still on the **Manifest** page, select **API permissions** under **Management**.
240238
241239
![Select API permissions on the application properties page.](media/exo-app-only-auth-select-api-permissions.png)
242240
@@ -251,13 +249,13 @@ For a detailed visual flow about creating applications in Azure AD, see <https:/
251249
252250
![Original incorrect API permissions.](media/exo-app-only-auth-original-permissions.png)
253251
254-
Select **Grant admin consent for \<Organization\>**, read the confirmation dialog that opens, and then click **Yes**.
252+
Select **Grant admin consent for \<Organization\>**, read the confirmation dialog that opens, and then select **Yes**.
255253
256254
The **Status** value should now be **Granted for \<Organization\>**.
257255
258256
![Admin consent granted.](media/exo-app-only-auth-admin-consent-granted.png)
259257
260-
4. Close the current **API permissions** page (not the browser tab) to return to the **App registrations** page. You'll use it in an upcoming step.
258+
4. Close the current **API permissions** page (not the browser tab) to return to the **App registrations** page. You use the **App registrations** page in an upcoming step.
261259
262260
### Step 3: Generate a self-signed certificate
263261
@@ -296,15 +294,15 @@ After you register the certificate with your application, you can use the privat
296294

297295
![Select Certificates & Secrets on the application properties page.](media/exo-app-only-auth-select-certificates-and-secrets.png)
298296

299-
3. On the **Certificates & secrets** page that opens, click **Upload certificate**.
297+
3. On the **Certificates & secrets** page that opens, select **Upload certificate**.
300298

301299
![Select Upload certificate on the Certificates & secrets page.](media/exo-app-only-auth-select-upload-certificate.png)
302300

303301
In the dialog that opens, browse to the self-signed certificate (`.cer` file) that you created in [Step 3](#step-3-generate-a-self-signed-certificate).
304302

305-
![Browse to the certificate and then click Add.](media/exo-app-only-auth-upload-certificate-dialog.png)
303+
![Browse to the certificate and then select Add.](media/exo-app-only-auth-upload-certificate-dialog.png)
306304

307-
When you're finished, click **Add**.
305+
When you're finished, select **Add**.
308306

309307
The certificate is now shown in the **Certificates** section.
310308

@@ -328,8 +326,8 @@ For more information about the URL syntax, see [Request the permissions from a d
328326

329327
You have two options:
330328

331-
- **Assign Azure AD roles to the application**: This method is supported in Exchange Online PowerShell and Security & Compliance PowerShell.
332-
- **Assign custom Exchange Online role groups to the application using service principals**: This method is supported only when you connect in [REST API mode](exchange-online-powershell-v2.md#updates-for-the-exo-v3-module).
329+
- **Assign Azure AD roles to the application**
330+
- **Assign custom role groups to the application using service principals**: This method is supported only when you connect to Exchange Online PowerShell or Security & Compliance PowerShell in [REST API mode](exchange-online-powershell-v2.md#updates-for-the-exo-v3-module). Security & Compliance PowerShell supports REST API mode in v3.2.0-Preview4 or later.
333331

334332
> [!NOTE]
335333
> You can also combine both methods to assign permissions. For example, you can use Azure AD roles for the "Exchange Recipient Administrator" role and also assign your custom RBAC role to extend the permissions.
@@ -379,7 +377,7 @@ For general instructions about assigning roles in Azure AD, see [View and assign
379377

380378
![Find and select a supported Security & Compliance PowerShell role by clicking on the role name.](media/exo-app-only-auth-find-and-select-supported-role-scc.png)
381379

382-
3. On the **Assignments** page that opens, click **Add assignments**.
380+
3. On the **Assignments** page that opens, select **Add assignments**.
383381

384382
- **Exchange Online PowerShell**:
385383

@@ -393,7 +391,7 @@ For general instructions about assigning roles in Azure AD, see [View and assign
393391

394392
![Find and select your app on the Add assignments flyout.](media/exo-app-only-auth-find-add-select-app-for-assignment.png)
395393

396-
When you're finished, click **Add**.
394+
When you're finished in the **Add assignments** flyout, select **Add**.
397395

398396
5. Back on the **Assignments** page, verify that the role has been assigned to the app.
399397

@@ -405,14 +403,14 @@ For general instructions about assigning roles in Azure AD, see [View and assign
405403

406404
![The role assignments page after to added the app to the role for Security & Compliance PowerShell.](media/exo-app-only-auth-app-assigned-to-role-scc.png)
407405

408-
#### Assign custom Exchange Online role groups to the application using service principals
406+
#### Assign custom role groups to the application using service principals
409407

410408
> [!NOTE]
411-
> You need to connect to Exchange Online PowerShell or Security & Compliance PowerShell _before_ completing steps to create a new service principal. Creating a new service principal without connecting to PowerShell won't work (your Azure App ID and Object ID is needed to create the new service principal).
409+
> You need to connect to Exchange Online PowerShell or Security & Compliance PowerShell _before_ completing steps to create a new service principal. Creating a new service principal without connecting to PowerShell won't work (your Azure App ID and Object ID are needed to create the new service principal).
412410
>
413-
> This method is supported only when you connect in [REST API mode](exchange-online-powershell-v2.md#updates-for-the-exo-v3-module).
411+
> This method is supported only when you connect to Exchange Online PowerShell or Security & Compliance PowerShell in [REST API mode](exchange-online-powershell-v2.md#updates-for-the-exo-v3-module). Security & Compliance PowerShell supports REST API mode in v3.2.0-Preview4 or later.
414412
415-
For information about creating custom role groups, see [Create role groups](/exchange/permissions-exo/role-groups#create-role-groups). The custom role group that you assign to the application can contain any combination of built-in and custom roles.
413+
For information about creating custom role groups, see [Create role groups in Exchange Online](/exchange/permissions-exo/role-groups#create-role-groups) and [Create Email & collaboration role groups in the Microsoft 365 Defender portal](/microsoft-365/security/office-365-security/mdo-portal-permissions#create-email--collaboration-role-groups-in-the-microsoft-365-defender-portal). The custom role group that you assign to the application can contain any combination of built-in and custom roles.
416414

417415
To assign custom role groups to the application using service principals, do the following steps:
418416

exchange/docs-conceptual/connect-exo-powershell-managed-identity.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,10 @@ Connect-ExchangeOnline -ManagedIdentity -Organization contoso.onmicrosoft.com
9292
After you've [created and configured a user-assigned managed identity](#create-and-configure-a-user-assigned-managed-identity), use the following syntax to connect to Exchange Online PowerShell:
9393

9494
```powershell
95-
Connect-ExchangeOnline -ManagedIdentity -Organization <YourDomain>.onmicrosoft.com -ManagedIdentityAccountId <UserAssignedManagedIdentityPrincipalIdValue>
95+
Connect-ExchangeOnline -ManagedIdentity -Organization <YourDomain>.onmicrosoft.com -ManagedIdentityAccountId <UserAssignedManagedIdentityClientIdValue>
9696
```
9797

98-
You get the \<UserAssignedManagedIdentityPrincipalIdValue\> value from [Step 3: Store the user-assigned managed identity in a variable](#step-3-store-the-user-assigned-managed-identity-in-a-variable).
98+
You get the \<UserAssignedManagedIdentityClientIdValue\> value from [Step 3: Store the user-assigned managed identity in a variable](#step-3-store-the-user-assigned-managed-identity-in-a-variable).
9999

100100
The rest of this section explains how to connect using supported Azure resources. For example:
101101

@@ -134,7 +134,7 @@ After you've successfully created the PowerShell runbook, do the following steps
134134
In a Windows PowerShell window in the Azure VM, use the command as described in the beginning of this section. For example:
135135

136136
```powershell
137-
$MI_ID = (Get-AzUserAssignedIdentity -Name "ContosoMI1" -ResourceGroupName "ContosoRG2").PrincipalId
137+
$MI_ID = (Get-AzUserAssignedIdentity -Name "ContosoMI1" -ResourceGroupName "ContosoRG2").ClientId
138138
139139
Connect-ExchangeOnline -ManagedIdentity -Organization contoso.onmicrosoft.com -ManagedIdentityAccountId $MI_ID
140140
```
@@ -518,10 +518,10 @@ For instructions, see the following articles:
518518

519519
### Step 3: Store the user-assigned managed identity in a variable
520520

521-
Use the following syntax in [Azure Az PowerShell](/powershell/azure/install-az-ps) to store the PrincipalId value of the user-assigned managed identity in variable that you'll use in the upcoming steps:
521+
Use the following syntax in [Azure Az PowerShell](/powershell/azure/install-az-ps) to store the ClientId value of the user-assigned managed identity in variable that you'll use in the upcoming steps:
522522

523523
```powershell
524-
$MI_ID = (Get-AzUserAssignedIdentity -Name "<UserAssignedMI>" -ResourceGroupName "<MIResourceGroupName>").PrincipalId
524+
$MI_ID = (Get-AzUserAssignedIdentity -Name "<UserAssignedMI>" -ResourceGroupName "<MIResourceGroupName>").ClientId
525525
```
526526

527527
- \<UserAssignedMI\> is the name of the user-assigned managed identity.
@@ -530,7 +530,7 @@ $MI_ID = (Get-AzUserAssignedIdentity -Name "<UserAssignedMI>" -ResourceGroupName
530530
For example:
531531

532532
```powershell
533-
$MI_ID = (Get-AzUserAssignedIdentity -Name "ContosoMI1" -ResourceGroupName "ContosoRG2").PrincipalId
533+
$MI_ID = (Get-AzUserAssignedIdentity -Name "ContosoMI1" -ResourceGroupName "ContosoRG2").ClientId
534534
```
535535

536536
To verify that the variable was captured successfully, run the command `$MI_ID`. The output should be a GUID value (for example, bf6dcc76-4331-4942-8d50-87ea41d6e8a1).

0 commit comments

Comments
 (0)