Skip to content

Commit 03871fc

Browse files
authored
Merge pull request #186150 from MicrosoftDocs/master
1/25 AM Publish
2 parents 4e2820a + db98142 commit 03871fc

File tree

172 files changed

+444
-385
lines changed

Some content is hidden

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

172 files changed

+444
-385
lines changed

articles/active-directory/authentication/howto-authentication-passwordless-security-key-on-premises.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ You must also meet the following system requirements:
5353
- [Windows Server 2016](https://support.microsoft.com/help/4534307/windows-10-update-kb4534307)
5454
- [Windows Server 2019](https://support.microsoft.com/help/4534321/windows-10-update-kb4534321)
5555

56+
- Have the credentials required to complete the steps in the scenario:
57+
- An Active Directory user who is a member of the Domain Admins group for a domain and a member of the Enterprise Admins group for a forest. Referred to as **$domainCred**.
58+
- An Azure Active Directory user who is a member of the Global Administrators role. Referred to as **$cloudCred**.
59+
5660
### Supported scenarios
5761

5862
The scenario in this article supports SSO in both of the following instances:
@@ -108,10 +112,10 @@ Run the following steps in each domain and forest in your organization that cont
108112
$domain = "contoso.corp.com"
109113
110114
# Enter an Azure Active Directory global administrator username and password.
111-
$cloudCred = Get-Credential
115+
$cloudCred = Get-Credential -Message 'An Active Directory user who is a member of the Domain Admins group for a domain and a member of the Enterprise Admins group for a forest.'
112116
113117
# Enter a domain administrator username and password.
114-
$domainCred = Get-Credential
118+
$domainCred = Get-Credential -Message 'An Active Directory user who is a member of the Domain Admins group.'
115119
116120
# Create the new Azure AD Kerberos Server object in Active Directory
117121
# and then publish it to Azure Active Directory.

articles/active-directory/cloud-sync/what-is-cloud-sync.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
---
2-
title: 'What is Azure AD Connect cloud sync. | Microsoft Docs'
2+
title: 'What is Azure AD Connect cloud sync? | Microsoft Docs'
33
description: Describes Azure AD Connect cloud sync.
44
services: active-directory
55
author: billmath
66
manager: karenhoran
77
ms.service: active-directory
88
ms.workload: identity
99
ms.topic: overview
10-
ms.date: 10/07/2021
10+
ms.date: 01/25/2022
1111
ms.subservice: hybrid
1212
ms.author: billmath
1313
ms.collection: M365-identity-device-management
1414
---
1515

1616
# What is Azure AD Connect cloud sync?
17-
Azure AD Connect cloud sync is new offering from Microsoft designed to meet and accomplish your hybrid identity goals for synchronization of users, groups and contacts to Azure AD. It accomplishes this by using the Azure AD cloud provisioning agent instead of the Azure AD Connect application. However, it can be used alongside Azure AD Connect sync and it provides the following benefits:
17+
Azure AD Connect cloud sync is new offering from Microsoft designed to meet and accomplish your hybrid identity goals for synchronization of users, groups, and contacts to Azure AD. It accomplishes this by using the Azure AD cloud provisioning agent instead of the Azure AD Connect application. However, it can be used alongside Azure AD Connect sync and it provides the following benefits:
1818

1919
- Support for synchronizing to an Azure AD tenant from a multi-forest disconnected Active Directory forest environment: The common scenarios include merger & acquisition (where the acquired company's AD forests are isolated from the parent company's AD forests), and companies that have historically had multiple AD forests.
2020
- Simplified installation with light-weight provisioning agents: The agents act as a bridge from AD to Azure AD, with all the sync configuration managed in the cloud.
2121
- Multiple provisioning agents can be used to simplify high availability deployments, particularly critical for organizations relying upon password hash synchronization from AD to Azure AD.
22-
- Support for large groups with up to 50K members. It is recommended to use only the OU scoping filter when synchronizing large groups.
22+
- Support for large groups with up to 50,000 members. It's recommended to use only the OU scoping filter when synchronizing large groups.
2323

2424
![What is Azure AD Connect](media/what-is-cloud-sync/architecture-1.png)
2525

@@ -66,13 +66,14 @@ The following table provides a comparison between Azure AD Connect and Azure AD
6666
| Support for password writeback |||
6767
| Support for device writeback|| |
6868
| Support for group writeback|| |
69+
| Support for merging user attributes from multiple domains|| |
6970
| Azure AD Domain Services support|| |
7071
| [Exchange hybrid writeback](../hybrid/reference-connect-sync-attributes-synchronized.md#exchange-hybrid-writeback) || |
7172
| Unlimited number of objects per AD domain || |
7273
| Support for up to 150,000 objects per AD domain |||
7374
| Groups with up to 50,000 members |||
7475
| Large groups with up to 250,000 members || |
75-
| Cross domain references|| |
76+
| Cross domain references|| |
7677
| On-demand provisioning|||
7778
| Support for US Government|||
7879

articles/active-directory/develop/msal-net-client-assertions.md

Lines changed: 51 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -71,36 +71,44 @@ jti | (a Guid) | The "jti" (JWT ID) claim provides a unique identifier for the J
7171
nbf | 1601519114 | The "nbf" (not before) claim identifies the time before which the JWT MUST NOT be accepted for processing. [RFC 7519, Section 4.1.5](https://tools.ietf.org/html/rfc7519#section-4.1.5). Using the current time is appropriate.
7272
sub | {ClientID} | The "sub" (subject) claim identifies the subject of the JWT, in this case also your application. Use the same value as `iss`.
7373

74-
Here is an example of how to craft these claims:
74+
If you use a certificate as a client secret, the certificate must be deployed safely. We recommend that you store the certificate in a secure spot supported by the platform, such as in the certificate store on Windows or by using Azure Key Vault.
75+
76+
Here's an example of how to craft these claims:
7577

7678
```csharp
77-
private static IDictionary<string, string> GetClaims()
79+
using System.Collections.Generic;
80+
private static IDictionary<string, object> GetClaims(string tenantId, string clientId)
7881
{
79-
//aud = https://login.microsoftonline.com/ + Tenant ID + /v2.0
80-
string aud = $"https://login.microsoftonline.com/{tenantId}/v2.0";
81-
82-
string ConfidentialClientID = "00000000-0000-0000-0000-000000000000" //client id
83-
const uint JwtToAadLifetimeInSeconds = 60 * 10; // Ten minutes
84-
DateTime validFrom = DateTime.UtcNow;
85-
var nbf = ConvertToTimeT(validFrom);
86-
var exp = ConvertToTimeT(validFrom + TimeSpan.FromSeconds(JwtToAadLifetimeInSeconds));
87-
88-
return new Dictionary<string, string>()
89-
{
90-
{ "aud", aud },
91-
{ "exp", exp.ToString() },
92-
{ "iss", ConfidentialClientID },
93-
{ "jti", Guid.NewGuid().ToString() },
94-
{ "nbf", nbf.ToString() },
95-
{ "sub", ConfidentialClientID }
96-
};
82+
//aud = https://login.microsoftonline.com/ + Tenant ID + /v2.0
83+
string aud = $"https://login.microsoftonline.com/{tenantId}/v2.0";
84+
85+
string ConfidentialClientID = clientId; //client id 00000000-0000-0000-0000-000000000000
86+
const uint JwtToAadLifetimeInSeconds = 60 * 10; // Ten minutes
87+
DateTimeOffset validFrom = DateTimeOffset.UtcNow;
88+
DateTimeOffset validUntil = validFrom.AddSeconds(JwtToAadLifetimeInSeconds);
89+
90+
return new Dictionary<string, object>()
91+
{
92+
{ "aud", aud },
93+
{ "exp", validUntil.ToUnixTimeSeconds() },
94+
{ "iss", ConfidentialClientID },
95+
{ "jti", Guid.NewGuid().ToString() },
96+
{ "nbf", validFrom.ToUnixTimeSeconds() },
97+
{ "sub", ConfidentialClientID }
98+
};
9799
}
98100
```
99101

100-
Here is how to craft a signed client assertion:
102+
Here's how to craft a signed client assertion:
101103

102104
```csharp
103-
string Encode(byte[] arg)
105+
using System.Collections.Generic;
106+
using System.Security.Cryptography.X509Certificates;
107+
using System.Security.Cryptography;
108+
using System.Text;
109+
using System.Text.Json;
110+
...
111+
static string Base64UrlEncode(byte[] arg)
104112
{
105113
char Base64PadCharacter = '=';
106114
char Base64Character62 = '+';
@@ -116,30 +124,28 @@ string Encode(byte[] arg)
116124
return s;
117125
}
118126

119-
string GetSignedClientAssertion()
127+
static string GetSignedClientAssertion(X509Certificate2 certificate, string tenantId, string clientId)
120128
{
121-
//Signing with SHA-256
122-
string rsaSha256Signature = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
123-
X509Certificate2 certificate = new X509Certificate2("Certificate.pfx", "Password", X509KeyStorageFlags.EphemeralKeySet);
124-
125-
//Create RSACryptoServiceProvider
126-
var x509Key = new X509AsymmetricSecurityKey(certificate);
127-
var privateKeyXmlParams = certificate.PrivateKey.ToXmlString(true);
128-
var rsa = new RSACryptoServiceProvider();
129-
rsa.FromXmlString(privateKeyXmlParams);
129+
// Get the RSA with the private key, used for signing.
130+
var rsa = certificate.GetRSAPrivateKey();
130131

131132
//alg represents the desired signing algorithm, which is SHA-256 in this case
132-
//kid represents the certificate thumbprint
133+
//x5t represents the certificate thumbprint base64 url encoded
133134
var header = new Dictionary<string, string>()
134-
{
135-
{ "alg", "RS256"},
136-
{ "kid", Encode(certificate.GetCertHash()) }
137-
};
135+
{
136+
{ "alg", "RS256"},
137+
{ "typ", "JWT" },
138+
{ "x5t", Base64UrlEncode(certificate.GetCertHash()) }
139+
};
138140

139141
//Please see the previous code snippet on how to craft claims for the GetClaims() method
140-
string token = Encode(Encoding.UTF8.GetBytes(JObject.FromObject(header).ToString())) + "." + Encode(Encoding.UTF8.GetBytes(JObject.FromObject(GetClaims()).ToString()));
142+
var claims = GetClaims(tenantId, clientId);
141143

142-
string signature = Encode(rsa.SignData(Encoding.UTF8.GetBytes(token), new SHA256Cng()));
144+
var headerBytes = JsonSerializer.SerializeToUtf8Bytes(header);
145+
var claimsBytes = JsonSerializer.SerializeToUtf8Bytes(claims);
146+
string token = Base64UrlEncode(headerBytes) + "." + Base64UrlEncode(claimsBytes);
147+
148+
string signature = Base64UrlEncode(rsa.SignData(Encoding.UTF8.GetBytes(token), HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1));
143149
string signedClientAssertion = string.Concat(token, ".", signature);
144150
return signedClientAssertion;
145151
}
@@ -150,10 +156,8 @@ string GetSignedClientAssertion()
150156
You also have the option of using [Microsoft.IdentityModel.JsonWebTokens](https://www.nuget.org/packages/Microsoft.IdentityModel.JsonWebTokens/) to create the assertion for you. The code will be a more elegant as shown in the example below:
151157

152158
```csharp
153-
string GetSignedClientAssertion()
159+
string GetSignedClientAssertionAlt(X509Certificate2 certificate)
154160
{
155-
var cert = new X509Certificate2("Certificate.pfx", "Password", X509KeyStorageFlags.EphemeralKeySet);
156-
157161
//aud = https://login.microsoftonline.com/ + Tenant ID + /v2.0
158162
string aud = $"https://login.microsoftonline.com/{tenantID}/v2.0";
159163

@@ -172,7 +176,7 @@ You also have the option of using [Microsoft.IdentityModel.JsonWebTokens](https:
172176
var securityTokenDescriptor = new SecurityTokenDescriptor
173177
{
174178
Claims = claims,
175-
SigningCredentials = new X509SigningCredentials(cert)
179+
SigningCredentials = new X509SigningCredentials(certificate)
176180
};
177181

178182
var handler = new JsonWebTokenHandler();
@@ -183,7 +187,10 @@ You also have the option of using [Microsoft.IdentityModel.JsonWebTokens](https:
183187
Once you have your signed client assertion, you can use it with the MSAL apis as shown below.
184188

185189
```csharp
186-
string signedClientAssertion = GetSignedClientAssertion();
190+
X509Certificate2 certificate = ReadCertificate(config.CertificateName);
191+
string signedClientAssertion = GetSignedClientAssertion(certificate, tenantId, ConfidentialClientID)
192+
// OR
193+
//string signedClientAssertion = GetSignedClientAssertionAlt(certificate);
187194
188195
var confidentialApp = ConfidentialClientApplicationBuilder
189196
.Create(ConfidentialClientID)

articles/active-directory/fundamentals/security-operations-privileged-accounts.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ You can monitor privileged account changes by using Azure AD Audit logs and Azur
198198

199199
| What to monitor| Risk level| Where| Filter/subfilter| Notes |
200200
| - | - | - | - | - |
201-
| Added to eligible privileged role| High| Azure AD Audit Logs| Service = PIM<br>-and-<br>Category = ​<br>-and-<br>Activity type = Add member to role completed (eligible)<br>-and-<br>Status = Success or failure​<br>-and-<br>Modified properties = Role.DisplayName| Any account eligible for a role is now being given privileged access. If the assignment is unexpected or into a role that isn't the responsibility of the account holder, investigate.<br>[Azure Sentinel template](https://github.com/Azure/Azure-Sentinel/blob/master/Detections/AuditLogs/UserAssignedPrivilegedRole.yaml) |
201+
| Added to eligible privileged role| High| Azure AD Audit Logs| Service = PIM<br>-and-<br>Category = Role management​<br>-and-<br>Activity type = Add member to role completed (eligible)<br>-and-<br>Status = Success or failure​<br>-and-<br>Modified properties = Role.DisplayName| Any account eligible for a role is now being given privileged access. If the assignment is unexpected or into a role that isn't the responsibility of the account holder, investigate.<br>[Azure Sentinel template](https://github.com/Azure/Azure-Sentinel/blob/master/Detections/AuditLogs/UserAssignedPrivilegedRole.yaml) |
202202
| Roles assigned out of PIM| High| Azure AD Audit Logs| Service = PIM<br>-and-<br>Category = Role management​<br>-and-<br>Activity type = Add member to role (permanent)<br>-and-<br>Status = Success or failure<br>-and-<br>Modified properties = Role.DisplayName| These roles should be closely monitored and alerted. Users shouldn't be assigned roles outside of PIM where possible.<br>[Azure Sentinel template](https://github.com/Azure/Azure-Sentinel/blob/master/Detections/AuditLogs/PrivlegedRoleAssignedOutsidePIM.yaml) |
203203
| Elevations| Medium| Azure AD Audit Logs| Service = PIM<br>-and-<br>Category = Role management<br>-and-<br>Activity type = Add member to role completed (PIM activation)<br>-and-<br>Status = Success or failure <br>-and-<br>Modified properties = Role.DisplayName| After a privileged account is elevated, it can now make changes that could affect the security of your tenant. All elevations should be logged and, if happening outside of the standard pattern for that user, should be alerted and investigated if not planned. |
204204
| Approvals and deny elevation| Low| Azure AD Audit Logs| Service = Access Review<br>-and-<br>Category = UserManagement<br>-and-<br>Activity type = Request approved or denied<br>-and-<br>Initiated actor = UPN| Monitor all elevations because it could give a clear indication of the timeline for an attack.<br>[Azure Sentinel template](https://github.com/Azure/Azure-Sentinel/blob/master/Detections/AuditLogs/PIMElevationRequestRejected.yaml) |

articles/active-directory/manage-apps/f5-big-ip-headers-easy-button.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ Prior BIG-IP experience isn’t necessary, but you’ll need:
8484

8585
* An existing header-based application or [setup a simple IIS header app](/previous-versions/iis/6.0-sdk/ms525396(v=vs.90)) for testing
8686

87-
## Big-IP configuration methods
87+
## BIG-IP configuration methods
8888

8989
There are many methods to deploy BIG-IP for this scenario including a template-driven Guided Configuration, or an advanced configuration. This tutorial covers the Easy Button templates offered by the Guided Configuration 16.1 and upwards.
9090

articles/active-directory/saas-apps/pendo-tutorial.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ Follow these steps to enable Azure AD SSO in the Azure portal.
7070

7171
1. On the **Set-up single sign-on with SAML** page, perform the following steps:
7272

73-
a. In the **Identifier** text box, type a URL using the following pattern:
74-
`https://sso.connect.pingidentity.com/<CUSTOM_GUID>`
73+
a. In the **Identifier** text box, enter `PingConnect`. (If this identifier is already used by another application, contact the [Pendo support team](mailto:[email protected]).)
74+
7575

7676
b. In the **Relay State** text box, type a URL using the following pattern:
7777
`https://pingone.com/1.0/<CUSTOM_GUID>`

articles/aks/use-managed-identity.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
title: Use managed identities in Azure Kubernetes Service
33
description: Learn how to use managed identities in Azure Kubernetes Service (AKS)
44
ms.topic: article
5-
ms.date: 05/12/2021
5+
ms.date: 01/25/2022
66
---
77

88
# Use managed identities in Azure Kubernetes Service
@@ -91,6 +91,9 @@ az aks update -g <RGName> -n <AKSName> --enable-managed-identity
9191
>
9292
> The Azure CLI will ensure your addon's permission is correctly set after migrating, if you're not using the Azure CLI to perform the migrating operation, you will need to handle the addon identity's permission by yourself. Here is one example using [ARM](../role-based-access-control/role-assignments-template.md).
9393
94+
> [!WARNING]
95+
> Nodepool upgrade will cause downtime for your AKS cluster as the nodes in the nodepools will be cordoned/drained and then reimaged.
96+
9497
## Obtain and use the system-assigned managed identity for your AKS cluster
9598

9699
Confirm your AKS cluster is using managed identity with the following CLI command:

articles/api-management/zone-redundancy.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ author: dlepow
55

66
ms.service: api-management
77
ms.topic: how-to
8-
ms.date: 08/11/2021
8+
ms.date: 01/24/2022
99
ms.author: danlep
1010
ms.custom: references_regions
1111

@@ -28,6 +28,7 @@ Configuring API Management for zone redundancy is currently supported in the fol
2828
* Canada Central
2929
* Central India (*)
3030
* Central US
31+
* East Asia
3132
* East US
3233
* East US 2
3334
* France Central

0 commit comments

Comments
 (0)