Skip to content

Commit 45b6674

Browse files
authored
Merge pull request #263408 from MicrosoftDocs/main
1/17/2024 AM Publish
2 parents 89f044e + 3295db7 commit 45b6674

File tree

39 files changed

+391
-213
lines changed

39 files changed

+391
-213
lines changed

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ manager: CelesteDG
99
ms.service: active-directory
1010

1111
ms.topic: reference
12-
ms.date: 01/11/2024
12+
ms.date: 01/17/2024
1313
ms.author: kengaderdus
1414
ms.subservice: B2C
1515

1616

17-
#Customer intent: As a developer using Azure Active Directory B2C custom policies, I want to understand how to use claim resolvers in my technical profiles, so that I can provide context information about authorization requests and populate claims with dynamic values.
17+
#Customer intent: As a developer using Azure AD B2C custom policies, I want to understand how to use claim resolvers in my technical profiles, so that I can provide context information about authorization requests and populate claims with dynamic values.
1818

1919
---
2020

@@ -122,6 +122,17 @@ Any parameter name included as part of an OIDC or OAuth2 request can be mapped t
122122
| {OAUTH-KV:loyalty_number} | A query string parameter. | 1234 |
123123
| {OAUTH-KV:any custom query string} | A query string parameter. | N/A |
124124

125+
## SAML key-value parameters
126+
127+
In a SAML authentication request, any parameter name that's included in the request, but isn’t specific to the protocol (such as SAMLRequest) can be mapped to a claim in the user journey. For example, the request may include a custom parameter such as `username`. This applies to both SP-Initiated and IDP-Initiated SAML requests.
128+
129+
| Claim | Description | Example |
130+
| ----- | ----------------------- | --------|
131+
| {SAML-KV:username} | A query string or POST body parameter. | [email protected] |
132+
| {SAML-KV:loyalty_number} | A query string or POST body parameter. | 1234 |
133+
| {SAML-KV:any custom query string} | A query string or POST body parameter. | N/A |
134+
135+
125136
## SAML
126137

127138
The following table lists the claim resolvers with information about the SAML authorization request:

articles/active-directory-b2c/configure-authentication-sample-python-web-app.md

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -86,24 +86,21 @@ Extract the sample file to a folder where the total length of the path is 260 or
8686

8787
In the project's root directory, follow these steps:
8888

89-
1. Rename the *app_config.py* file to *app_config.py.OLD*.
90-
1. Rename the *app_config_b2c.py* file to *app_config.py*. This file contains information about your Azure AD B2C identity provider.
91-
92-
1. Create an `.env` file in the root folder of the project using `.env.sample.b2c` as a guide.
89+
1. Create an `.env` file in the root folder of the project using `.env.sample` as a guide.
9390

9491
```shell
9592
FLASK_DEBUG=True
96-
TENANT_NAME=<tenant name>
93+
B2C_TENANT_NAME=<tenant name>
9794
CLIENT_ID=<client id>
9895
CLIENT_SECRET=<client secret>
99-
SIGNUPSIGNIN_USER_FLOW=B2C_1_profile_editing
100-
EDITPROFILE_USER_FLOW=B2C_1_reset_password
101-
RESETPASSWORD_USER_FLOW=B2C_1_signupsignin1
96+
SIGNUPSIGNIN_USER_FLOW=B2C_1_signupsignin1
97+
EDITPROFILE_USER_FLOW=B2C_1_profile_editing
98+
RESETPASSWORD_USER_FLOW=B2C_1_reset_password
10299
```
103100

104101
|Key |Value |
105102
|---------|---------|
106-
|`TENANT_NAME`| The first part of your Azure AD B2C [tenant name](tenant-management-read-tenant-name.md#get-your-tenant-name) (for example, `contoso`). |
103+
|`B2C_TENANT_NAME`| The first part of your Azure AD B2C [tenant name](tenant-management-read-tenant-name.md#get-your-tenant-name) (for example, `contoso`). |
107104
|`CLIENT_ID`| The web API application ID from [step 2.1](#step-21-register-the-app).|
108105
|`CLIENT_SECRET`| The client secret value you created in [step 2.2](#step-22-create-a-web-app-client-secret). |
109106
|`*_USER_FLOW`|The user flows you created in [step 1](#step-1-configure-your-user-flow).|

articles/active-directory-b2c/custom-policy-developer-notes.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ The following table summarizes the Security Assertion Markup Language (SAML) app
177177
| ------- | :--: | ----- |
178178
| Azure portal | GA | |
179179
| [Application Insights user journey logs](troubleshoot-with-application-insights.md) | Preview | Used for troubleshooting during development. |
180-
| [Application Insights event logs](analytics-with-application-insights.md) | Preview | Used to monitor user flows in production. |
180+
| [Application Insights event logs](analytics-with-application-insights.md) | Preview | Used to monitor user flows and custom policies in production. |
181181

182182
## Other features
183183

articles/active-directory-b2c/openid-connect.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ Error responses can also be sent to the `redirect_uri` parameter so that the app
9494
```http
9595
GET https://jwt.ms/#
9696
error=access_denied
97-
&error_description=the+user+canceled+the+authentication
97+
&error_description=AADB2C90091%3a+The+user+has+cancelled+entering+self-asserted+information.%0d%0aCorrelation+ID%3a+xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx%0d%0aTimestamp%3a+xxxx-xx-xx+xx%3a23%3a27Z%0d%0a
9898
&state=arbitrary_data_you_can_receive_in_the_response
9999
```
100100

@@ -202,8 +202,8 @@ Error responses look like:
202202

203203
```json
204204
{
205-
"error": "access_denied",
206-
"error_description": "The user revoked access to the app."
205+
"error": "invalid_grant",
206+
"error_description": "AADB2C90080: The provided grant has expired. Please re-authenticate and try again. Current time: xxxxxxxxxx, Grant issued time: xxxxxxxxxx, Grant expiration time: xxxxxxxxxx\r\nCorrelation ID: xxxxxxxx-xxxx-xxxX-xxxx-xxxxxxxxxxxx\r\nTimestamp: xxxx-xx-16 xx:10:52Z\r\n"
207207
}
208208
```
209209

@@ -279,8 +279,8 @@ Error responses look like:
279279

280280
```json
281281
{
282-
"error": "access_denied",
283-
"error_description": "The user revoked access to the app.",
282+
"error": "invalid_grant",
283+
"error_description": "AADB2C90129: The provided grant has been revoked. Please reauthenticate and try again.\r\nCorrelation ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\r\nTimestamp: xxxx-xx-xx xx:xx:xxZ\r\n",
284284
}
285285
```
286286

@@ -318,4 +318,4 @@ To set the required ID Token in logout requests, see [Configure session behavior
318318

319319
## Next steps
320320

321-
- Learn more about [Azure AD B2C session](session-behavior.md).
321+
- Learn more about [Azure AD B2C session](session-behavior.md).

articles/active-directory-b2c/restful-technical-profile.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -276,13 +276,13 @@ The following example shows a C# class that returns an error message:
276276
```csharp
277277
public class ResponseContent
278278
{
279-
public string version { get; set; }
280-
public int status { get; set; }
281-
public string code { get; set; }
282-
public string userMessage { get; set; }
283-
public string developerMessage { get; set; }
284-
public string requestId { get; set; }
285-
public string moreInfo { get; set; }
279+
public string Version { get; set; }
280+
public int Status { get; set; }
281+
public string Code { get; set; }
282+
public string UserMessage { get; set; }
283+
public string DeveloperMessage { get; set; }
284+
public string RequestId { get; set; }
285+
public string MoreInfo { get; set; }
286286
}
287287
```
288288

articles/active-directory-b2c/userinfo-endpoint.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ ms.service: active-directory
99

1010
ms.topic: reference
1111
ms.date: 01/11/2024
12+
1213
ms.author: kengaderdus
1314
ms.subservice: B2C
1415
zone_pivot_groups: b2c-policy-type

articles/active-directory-b2c/userjourneys.md

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,12 @@ manager: CelesteDG
88
ms.service: active-directory
99

1010
ms.topic: reference
11-
ms.date: 01/11/2024
11+
ms.date: 01/17/2024
1212
ms.author: kengaderdus
1313
ms.subservice: B2C
1414

1515

16-
#Customer intent: As a developer integrating Azure AD B2C into an application, I want to understand how user journeys, authorization technical profiles, orchestration steps, preconditions, claims provider selection, claims exchanges, and journey lists work, so that I can configure the policy file correctly and ensure a successful user flow.
17-
16+
#Customer intent: As a developer integrating Azure AD B2C into an application, I want to understand how custom policy user journeys work so that I can design the steps that a users goes through for the relying party application to obtain the desired claims for a user.
1817
---
1918

2019
# UserJourneys
@@ -92,7 +91,7 @@ A user journey is represented as an orchestration sequence that must be followed
9291

9392
Orchestration steps can be conditionally executed based on preconditions defined in the orchestration step element. For example, you can check to perform an orchestration step only if a specific claim exists, or if a claim is equal or not to the specified value.
9493

95-
To specify the ordered list of orchestration steps, an **OrchestrationSteps** element is added as part of the policy. This element is required.
94+
To specify the ordered list of orchestration steps, an **OrchestrationSteps** element is added as part of the policy. This element is required.
9695

9796
```xml
9897
<UserJourney Id="SignUpOrSignIn">
@@ -111,7 +110,7 @@ The **OrchestrationStep** element contains the following attributes:
111110

112111
| Attribute | Required | Description |
113112
| --------- | -------- | ----------- |
114-
| `Order` | Yes | The order of the orchestration steps. |
113+
| `Order` | Yes | The order of the orchestration steps. The value of the `Order` attribute starts at `1` through `N`. So, if you've 10 steps and you delete the second step, you need to renumber the steps three to 10 to become two to nine. |
115114
| `Type` | Yes | The type of the orchestration step. Possible values: <ul><li>**ClaimsProviderSelection** - Indicates that the orchestration step presents various claims providers to the user to select one.</li><li>**CombinedSignInAndSignUp** - Indicates that the orchestration step presents a combined social provider sign-in and local account sign-up page.</li><li>**ClaimsExchange** - Indicates that the orchestration step exchanges claims with a claims provider.</li><li>**GetClaims** - Specifies that the orchestration step should process claim data sent to Azure AD B2C from the relying party via its `InputClaims` configuration.</li><li>**InvokeSubJourney** - Indicates that the orchestration step exchanges claims with a [sub journey](subjourneys.md).</li><li>**SendClaims** - Indicates that the orchestration step sends the claims to the relying party with a token issued by a claims issuer.</li></ul> |
116115
| ContentDefinitionReferenceId | No | The identifier of the [content definition](contentdefinitions.md) associated with this orchestration step. Usually the content definition reference identifier is defined in the self-asserted technical profile. But, there are some cases when Azure AD B2C needs to display something without a technical profile. There are two examples - if the type of the orchestration step is one of following: `ClaimsProviderSelection` or `CombinedSignInAndSignUp`, Azure AD B2C needs to display the identity provider selection without having a technical profile. |
117116
| CpimIssuerTechnicalProfileReferenceId | No | The type of the orchestration step is `SendClaims`. This property defines the technical profile identifier of the claims provider that issues the token for the relying party. If absent, no relying party token is created. |

articles/ai-services/speech-service/regions.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ author: eric-urban
66
manager: nitinme
77
ms.service: azure-ai-speech
88
ms.topic: conceptual
9-
ms.date: 10/27/2023
9+
ms.date: 1/17/2024
1010
ms.author: eur
1111
ms.custom: references_regions
1212
---
@@ -50,6 +50,7 @@ The following regions are supported for Speech service features such as speech t
5050
| Europe | UK South | `uksouth` <sup>1,2,3,4,7</sup>|
5151
| Middle East | UAE North | `uaenorth` <sup>6</sup>|
5252
| South America | Brazil South | `brazilsouth` <sup>6</sup>|
53+
| Qatar | Qatar Central | `qatarcentral`<sup>8</sup> |
5354
| US | Central US | `centralus` |
5455
| US | East US | `eastus` <sup>1,2,3,4,5,7,9</sup>|
5556
| US | East US 2 | `eastus2` <sup>1,2,4,5</sup>|

articles/aks/workload-identity-deploy-cluster.md

Lines changed: 75 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -66,16 +66,16 @@ az aks update -g "${RESOURCE_GROUP}" -n myAKSCluster --enable-oidc-issuer --enab
6666
To get the OIDC Issuer URL and save it to an environmental variable, run the following command. Replace the default value for the arguments `-n`, which is the name of the cluster:
6767

6868
```bash
69-
export AKS_OIDC_ISSUER="$(az aks show -n myAKSCluster -g "${RESOURCE_GROUP}" --query "oidcIssuerProfile.issuerUrl" -otsv)"
69+
export AKS_OIDC_ISSUER="$(az aks show -n myAKSCluster -g "${RESOURCE_GROUP}" --query "oidcIssuerProfile.issuerUrl" -o tsv)"
7070
```
7171

7272
The variable should contain the Issuer URL similar to the following example:
7373

7474
```output
75-
https://eastus.oic.prod-aks.azure.com/00000000-0000-0000-0000-000000000000/00000000-0000-0000-0000-000000000000/
75+
https://eastus.oic.prod-aks.azure.com/00000000-0000-0000-0000-000000000000/11111111-1111-1111-1111-111111111111/
7676
```
7777

78-
By default, the Issuer is set to use the base URL `https://{region}.oic.prod-aks.azure.com/{uuid}`, where the value for `{region}` matches the location the AKS cluster is deployed in. The value `{uuid}` represents the OIDC key.
78+
By default, the Issuer is set to use the base URL `https://{region}.oic.prod-aks.azure.com/{tenant_id}/{uuid}`, where the value for `{region}` matches the location the AKS cluster is deployed in. The value `{uuid}` represents the OIDC key.
7979

8080
## Create a managed identity
8181

@@ -88,7 +88,7 @@ az identity create --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${R
8888
Next, let's create a variable for the managed identity ID.
8989

9090
```bash
91-
export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -otsv)"
91+
export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -o tsv)"
9292
```
9393

9494
## Create Kubernetes service account
@@ -116,7 +116,7 @@ EOF
116116
The following output resembles successful creation of the identity:
117117

118118
```output
119-
Serviceaccount/workload-identity-sa created
119+
serviceaccount/workload-identity-sa created
120120
```
121121

122122
## Establish federated identity credential
@@ -139,33 +139,21 @@ cat <<EOF | kubectl apply -f -
139139
apiVersion: v1
140140
kind: Pod
141141
metadata:
142-
name: quick-start
142+
name: your-pod
143143
namespace: "${SERVICE_ACCOUNT_NAMESPACE}"
144144
labels:
145145
azure.workload.identity/use: "true"
146146
spec:
147147
serviceAccountName: "${SERVICE_ACCOUNT_NAME}"
148+
containers:
149+
- image: <your image>
150+
name: <containerName>
148151
EOF
149152
```
150153

151154
> [!IMPORTANT]
152155
> Ensure your application pods using workload identity have added the following label `azure.workload.identity/use: "true"` to your pod spec, otherwise the pods fail after their restarted.
153156
154-
```bash
155-
kubectl apply -f <your application>
156-
```
157-
158-
To check whether all properties are injected properly by the webhook, use the [kubectl describe][kubectl-describe] command:
159-
160-
```bash
161-
kubectl describe pod containerName
162-
```
163-
164-
To verify that pod is able to get a token and access the resource, use the kubectl logs command:
165-
166-
```bash
167-
kubectl logs containerName
168-
```
169157

170158
## Optional - Grant permissions to access Azure Key Vault
171159

@@ -181,20 +169,82 @@ You can retrieve this information using the Azure CLI command: [az keyvault list
181169
1. Set an access policy for the managed identity to access secrets in your Key Vault by running the following commands:
182170

183171
```azurecli-interactive
184-
export RESOURCE_GROUP="myResourceGroup"
185-
export USER_ASSIGNED_IDENTITY_NAME="myIdentity"
172+
export KEYVAULT_RESOURCE_GROUP="myResourceGroup"
186173
export KEYVAULT_NAME="myKeyVault"
187-
export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -otsv)"
174+
export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -o tsv)"
188175
189176
az keyvault set-policy --name "${KEYVAULT_NAME}" --secret-permissions get --spn "${USER_ASSIGNED_CLIENT_ID}"
190177
```
191178
179+
2. Create a secret in Key Vault:
180+
181+
```azurecli-interactive
182+
export KEYVAULT_SECRET_NAME="my-secret"
183+
184+
az keyvault secret set --vault-name "${KEYVAULT_NAME}" \
185+
--name "${KEYVAULT_SECRET_NAME}" \
186+
--value "Hello\!"
187+
```
188+
189+
3. Export Key Vault URL:
190+
```azurecli-interactive
191+
export KEYVAULT_URL="$(az keyvault show -g ${KEYVAULT_RESOURCE_GROUP} -n ${KEYVAULT_NAME} --query properties.vaultUri -o tsv)"
192+
```
193+
194+
4. Deploy a pod that references the service account and Key Vault URL above:
195+
196+
```yml
197+
cat <<EOF | kubectl apply -f -
198+
apiVersion: v1
199+
kind: Pod
200+
metadata:
201+
name: quick-start
202+
namespace: ${SERVICE_ACCOUNT_NAMESPACE}
203+
labels:
204+
azure.workload.identity/use: "true"
205+
spec:
206+
serviceAccountName: ${SERVICE_ACCOUNT_NAME}
207+
containers:
208+
- image: ghcr.io/azure/azure-workload-identity/msal-go
209+
name: oidc
210+
env:
211+
- name: KEYVAULT_URL
212+
value: ${KEYVAULT_URL}
213+
- name: SECRET_NAME
214+
value: ${KEYVAULT_SECRET_NAME}
215+
nodeSelector:
216+
kubernetes.io/os: linux
217+
EOF
218+
```
219+
220+
To check whether all properties are injected properly by the webhook, use the [kubectl describe][kubectl-describe] command:
221+
222+
```bash
223+
kubectl describe pod quick-start | grep "SECRET_NAME:"
224+
```
225+
226+
If successful, the output should be similar to the following:
227+
```bash
228+
SECRET_NAME: ${KEYVAULT_SECRET_NAME}
229+
```
230+
231+
To verify that pod is able to get a token and access the resource, use the kubectl logs command:
232+
233+
```bash
234+
kubectl logs quick-start
235+
```
236+
237+
If successful, the output should be similar to the following:
238+
```bash
239+
I0114 10:35:09.795900 1 main.go:63] "successfully got secret" secret="Hello\\!"
240+
```
241+
192242
## Disable workload identity
193243

194244
To disable the Microsoft Entra Workload ID on the AKS cluster where it's been enabled and configured, you can run the following command:
195245

196246
```azurecli-interactive
197-
az aks update --resource-group myResourceGroup --name myAKSCluster --disable-workload-identity
247+
az aks update --resource-group "${RESOURCE_GROUP}" --name myAKSCluster --disable-workload-identity
198248
```
199249

200250
## Next steps

articles/azure-monitor/app/convert-classic-resource.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ Use the following script to identify your Application Insights resources by inge
130130
#### Example
131131

132132
```azurecli
133-
Get-AzApplicationInsights -SubscriptionId '1234abcd-5678-efgh-9012-ijklmnopqrst' | Format-Table -Property Name, IngestionMode, Id, @{label='Type';expression={
133+
Get-AzApplicationInsights -SubscriptionId 'Your Subscription ID' | Format-Table -Property Name, IngestionMode, Id, @{label='Type';expression={
134134
if ([string]::IsNullOrEmpty($_.IngestionMode)) {
135135
'Unknown'
136136
} elseif ($_.IngestionMode -eq 'LogAnalytics') {

0 commit comments

Comments
 (0)