Skip to content

Commit db98142

Browse files
authored
Merge pull request #186053 from MicrosoftDocs/repo_sync_working_branch
Confirm merge from repo_sync_working_branch to master to sync with https://github.com/MicrosoftDocs/azure-docs (branch master)
2 parents 8d79daa + 0c3f7ce commit db98142

File tree

12 files changed

+75
-62
lines changed

12 files changed

+75
-62
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/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/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/automation/overview.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ Azure Automation supports management throughout the lifecycle of your infrastruc
9999
* **Dev/test automation scenarios** - Start and start resources, scale resources, etc.
100100
* **Governance related automation** - Automatically apply or update tags, locks, etc.
101101
* **Azure Site Recovery** - orchestrate pre/post scripts defined in a Site Recovery DR workflow.
102-
* **Windows Virtual Desktop** - orchestrate scaling of VMs or start/stop VMs based on utilization.
102+
* **Azure Virtual Desktop** - orchestrate scaling of VMs or start/stop VMs based on utilization.
103103

104104
Depending on your requirements, one or more of the following Azure services integrate with or compliment Azure Automation to help fullfil them:
105105

@@ -125,4 +125,4 @@ You can review the prices associated with Azure Automation on the [pricing](http
125125
## Next steps
126126

127127
> [!div class="nextstepaction"]
128-
> [Create an Automation account](./quickstarts/create-account-portal.md)
128+
> [Create an Automation account](./quickstarts/create-account-portal.md)

articles/azure-percept/azure-percept-devkit-container-release-notes.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ To download the container updates, go to [Azure Percept Studio](https://ms.porta
1717
## December (2112) Release
1818

1919
- Removed lines in the image frames using automatic image capture in Azure Percept Studio. This issue was introduced in the 2108 module release.
20-
- Security fixes for docker services running as root in azureeyemodule, azureearspeechclientmodule, and webstreammodule.
20+
- Security fixes for docker services running as root in azureeyemodule (mcr.microsoft.com/azureedgedevices/azureeyemodule:2112-1), azureearspeechclientmodule, and webstreammodule.
2121

2222
## August (2108) Release
2323

articles/azure-sql/database/features-comparison.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ The Azure platform provides a number of PaaS capabilities that are added as an a
148148
| [SQL Server Reporting Services (SSRS)](/sql/reporting-services/create-deploy-and-manage-mobile-and-paginated-reports) | No - [see Power BI](/power-bi/) | No - use [Power BI paginated reports](/power-bi/paginated-reports/paginated-reports-report-builder-power-bi) instead or host SSRS on an Azure VM. While SQL Managed Instance cannot run SSRS as a service, it can host [SSRS catalog databases](/sql/reporting-services/install-windows/ssrs-report-server-create-a-report-server-database#database-server-version-requirements) for a reporting server installed on Azure Virtual Machine, using SQL Server authentication. |
149149
| [Query Performance Insights (QPI)](query-performance-insight-use.md) | Yes | No. Use built-in reports in SQL Server Management Studio and Azure Data Studio. |
150150
| [VNet](../../virtual-network/virtual-networks-overview.md) | Partial, it enables restricted access using [VNet Endpoints](vnet-service-endpoint-rule-overview.md) | Yes, SQL Managed Instance is injected in customer's VNet. See [subnet](../managed-instance/transact-sql-tsql-differences-sql-server.md#subnet) and [VNet](../managed-instance/transact-sql-tsql-differences-sql-server.md#vnet) |
151-
| VNet Service endpoint | [Yes](vnet-service-endpoint-rule-overview.md) | No |
151+
| VNet Service endpoint | [Yes](vnet-service-endpoint-rule-overview.md) | Yes |
152152
| VNet Global peering | Yes, using [Private IP and service endpoints](vnet-service-endpoint-rule-overview.md) | Yes, using [Virtual network peering](https://techcommunity.microsoft.com/t5/azure-sql/new-feature-global-vnet-peering-support-for-azure-sql-managed/ba-p/1746913). |
153153
| [Private connectivity](../../private-link/private-link-overview.md) | Yes, using [Private Link](../../private-link/private-endpoint-overview.md) | Yes, using VNet. |
154154

articles/frontdoor/front-door-routing-architecture.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ When Azure Front Door receives your client requests, it will do one of two thing
2020

2121
Traffic routed to the Azure Front Door environments uses [Anycast](https://en.wikipedia.org/wiki/Anycast) for both DNS (Domain Name System) and HTTP (Hypertext Transfer Protocol) traffic, which allows for user requests to reach the closest environment in the fewest network hops. This architecture offers better round-trip times for end users by maximizing the benefits of Split TCP. Front Door organizes its environments into primary and fallback "rings". The outer ring has environments that are closer to users, offering lower latencies. The inner ring has environments that can handle the failover for the outer ring environment in case any issues happen. The outer ring is the preferred target for all traffic and the inner ring is to handle traffic overflow from the outer ring. Each frontend host or domain served by Front Door gets assigned a primary VIP (Virtual Internet Protocol addresses), which gets announced by environments in both the inner and outer ring. A fallback VIP is only announced by environments in the inner ring.
2222

23-
This architecture ensures that requests from your end users always reach the closest Front Door environment. Even if the preferred Front Door environment is unhealthy all traffic automatically moves to the next closest environment.
23+
This architecture ensures that requests from your end users always reach the closest Front Door environment. If the preferred Front Door environment is unhealthy, all traffic automatically moves to the next closest environment.
2424

2525
## <a name = "splittcp"></a>Connecting to Front Door environment (Split TCP)
2626

0 commit comments

Comments
 (0)