Skip to content

Commit 3fc7dc8

Browse files
authored
Merge pull request #217362 from MicrosoftDocs/main
Publish to live, Monday 4 AM PST, 11/7
2 parents 8a31709 + fb75e54 commit 3fc7dc8

File tree

180 files changed

+1351
-630
lines changed

Some content is hidden

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

180 files changed

+1351
-630
lines changed

articles/active-directory-b2c/self-asserted-technical-profile.md

Lines changed: 2 additions & 4 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: 02/17/2022
12+
ms.date: 11/07/2022
1313
ms.author: kengaderdus
1414
ms.subservice: B2C
1515
---
@@ -50,8 +50,6 @@ In a self-asserted technical profile, you can use the **InputClaims** and **Inpu
5050

5151
## Display claims
5252

53-
The display claims feature is currently in **preview**.
54-
5553
The **DisplayClaims** element contains a list of claims to be presented on the screen for collecting data from the user. To prepopulate the values of display claims, use the input claims that were previously described. The element may also contain a default value.
5654

5755
The order of the claims in **DisplayClaims** specifies the order in which Azure AD B2C renders the claims on the screen. To force the user to provide a value for a specific claim, set the **Required** attribute of the **DisplayClaim** element to `true`.
@@ -133,7 +131,7 @@ Use output claims when:
133131
- **Claims are output by output claims transformation**.
134132
- **Setting a default value in an output claim** without collecting data from the user or returning the data from the validation technical profile. The `LocalAccountSignUpWithLogonEmail` self-asserted technical profile sets the **executed-SelfAsserted-Input** claim to `true`.
135133
- **A validation technical profile returns the output claims** - Your technical profile may call a validation technical profile that returns some claims. You may want to bubble up the claims and return them to the next orchestration steps in the user journey. For example, when signing in with a local account, the self-asserted technical profile named `SelfAsserted-LocalAccountSignin-Email` calls the validation technical profile named `login-NonInteractive`. This technical profile validates the user credentials and also returns the user profile. Such as 'userPrincipalName', 'displayName', 'givenName' and 'surName'.
136-
- **A display control returns the output claims** - Your technical profile may have a reference to a [display control](display-controls.md). The display control returns some claims, such as the verified email address. You may want to bubble up the claims and return them to the next orchestration steps in the user journey. The display control feature is currently in **preview**.
134+
- **A display control returns the output claims** - Your technical profile may have a reference to a [display control](display-controls.md). The display control returns some claims, such as the verified email address. You may want to bubble up the claims and return them to the next orchestration steps in the user journey.
137135

138136
The following example demonstrates the use of a self-asserted technical profile that uses both display claims and output claims.
139137

articles/active-directory/develop/tutorial-v2-nodejs-desktop.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ Create a folder to host your application, for example *ElectronDesktopApp*.
5252

5353
```console
5454
npm init -y
55-
npm install --save @azure/msal-node @microsoft/microsoft-graph-sdk isomorphic-fetch bootstrap jquery popper.js
55+
npm install --save @azure/msal-node @microsoft/microsoft-graph-client isomorphic-fetch bootstrap jquery popper.js
5656
npm install --save-dev [email protected]
5757
```
5858

articles/active-directory/external-identities/user-flow-add-custom-attributes.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@ manager: celestedg
88
ms.service: active-directory
99
ms.subservice: B2B
1010
ms.topic: how-to
11-
ms.date: 03/02/2021
11+
ms.date: 11/07/2022
1212
ms.author: mimart
13-
ms.custom: engagement-fy23, "it-pro"
13+
ms.custom: engagement-fy23, it-pro
1414
ms.collection: M365-identity-device-management
15+
16+
# Customer intent: As a tenant administrator, I want to create custom attributes for the self-service sign-up user flows.
1517
---
1618

1719
# Define custom attributes for user flows
@@ -53,4 +55,5 @@ Once you've created a new user using a user flow that uses the newly created cus
5355

5456
## Next steps
5557

56-
[Add a self-service sign-up user flow to an app](self-service-sign-up-user-flow.md)
58+
- [Add a self-service sign-up user flow to an app](self-service-sign-up-user-flow.md)
59+
- [Customize the user flow language](user-flow-customize-language.md)

articles/api-management/virtual-network-reference.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ When an API Management service instance is hosted in a VNet, the ports in the fo
3030

3131
### [stv2](#tab/stv2)
3232

33+
>[!IMPORTANT]
34+
> When using `stv2`, it is required to assign a Network Security Group to your VNet in order for the Azure Load Balancer to work. Learn more in the [Azure Load Balancer documentation](/security/benchmark/azure/baselines/azure-load-balancer-security-baseline#network-security-group-support).
35+
3336
| Source / Destination Port(s) | Direction | Transport protocol | Service tags <br> Source / Destination | Purpose | VNet type |
3437
|------------------------------|--------------------|--------------------|---------------------------------------|-------------------------------------------------------------|----------------------|
3538
| * / [80], 443 | Inbound | TCP | Internet / VirtualNetwork | **Client communication to API Management** | External only |

articles/azure-functions/functions-develop-local.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ When you develop your functions locally, you need to take trigger and binding be
9191

9292
## Local storage emulator
9393

94-
During local development, you can use the local [Azurite emulator](/azure/storage/common/storage-use-azurite.md) when testing functions with Azure Storage bindings (Queue Storage, Blob Storage, and Table Storage), without having to connect to remote storage services. Azurite integrates with Visual Studio Code and Visual Studio, and you can also run it from the command prompt using npm. For more information, see [Use the Azurite emulator for local Azure Storage development](/storage/common/storage-use-azurite.md).
94+
During local development, you can use the local [Azurite emulator](../storage/common/storage-use-azurite.md) when testing functions with Azure Storage bindings (Queue Storage, Blob Storage, and Table Storage), without having to connect to remote storage services. Azurite integrates with Visual Studio Code and Visual Studio, and you can also run it from the command prompt using npm. For more information, see [Use the Azurite emulator for local Azure Storage development](../storage/common/storage-use-azurite.md).
9595

9696
The following setting in the `Values` collection of the local.settings.json file tells the local Functions host to use Azurite for the default `AzureWebJobsStorage` connection:
9797

articles/cognitive-services/Anomaly-Detector/How-to/streaming-inference.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ A sample request:
4444
{
4545
"variables": [
4646
{
47-
"variableName": "Variable_1",
47+
"variable": "Variable_1",
4848
"timestamps": [
4949
"2021-01-01T00:00:00Z",
5050
"2021-01-01T00:01:00Z",
@@ -59,7 +59,7 @@ A sample request:
5959
]
6060
},
6161
{
62-
"variableName": "Variable_2",
62+
"variable": "Variable_2",
6363
"timestamps": [
6464
"2021-01-01T00:00:00Z",
6565
"2021-01-01T00:01:00Z",
@@ -74,7 +74,7 @@ A sample request:
7474
]
7575
},
7676
{
77-
"variableName": "Variable_3",
77+
"variable": "Variable_3",
7878
"timestamps": [
7979
"2021-01-01T00:00:00Z",
8080
"2021-01-01T00:01:00Z",

articles/communication-services/quickstarts/voice-video-calling/includes/call-automation/callflow-for-customer-interactions-csharp.md

Lines changed: 75 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ services: azure-communication-services
55
author: ashwinder
66

77
ms.service: azure-communication-services
8-
ms.subservice: azure-communication-services
8+
ms.subservice: call-automation
99
ms.date: 09/06/2022
1010
ms.topic: include
1111
ms.custom: include file
@@ -15,14 +15,9 @@ ms.author: askaur
1515
## Prerequisites
1616

1717
- An Azure account with an active subscription.
18-
- A deployed Communication Service resource.
19-
- [Acquire a PSTN phone number from the Communication Service resource](../../../telephony/get-phone-number.md?pivots=programming-language-csharp).
20-
- The latest [.NET library](https://dotnet.microsoft.com/download/dotnet-core) for your operating system.
21-
- A [web service application](https://dotnet.microsoft.com/download/dotnet-core) to handle web hook callback events.
22-
- Optional: [NGROK application](https://ngrok.com/) to proxy HTTP/S requests to a local development machine.
23-
- The [ARMClient application](https://github.com/projectkudu/ARMClient), used to configure the Event Grid subscription.
24-
- Obtain the NuGet package from the [Azure SDK Dev Feed](https://github.com/Azure/azure-sdk-for-net/blob/main/CONTRIBUTING.md#nuget-package-dev-feed)
25-
- [An Event Grid subscription for Incoming Call](../../../../how-tos/call-automation-sdk/subscribe-to-incoming-call.md)
18+
- A Communication Service resource.
19+
- [Acquire a phone number for your Communication Service resource](../../../telephony/get-phone-number.md?pivots=programming-language-csharp).
20+
- The latest [.NET library](https://dotnet.microsoft.com/download/dotnet-core) for your operating system. .NET 6.0 or higher is recommended as this quickstart uses the minimal API feature.
2621

2722
## Create a new C# application
2823

@@ -32,34 +27,48 @@ In the console window of your operating system, use the `dotnet` command to crea
3227
dotnet new web -n MyApplication
3328
```
3429

35-
## Install the NuGet package
30+
## Configure NuGet package manager
3631

37-
During the preview phase, the NuGet package can be obtained by configuring your package manager to use the Azure SDK Dev Feed from [here](https://github.com/Azure/azure-sdk-for-net/blob/main/CONTRIBUTING.md#nuget-package-dev-feed)
32+
During the preview phase, the `Azure.Communication.CallAutomation` NuGet package can be obtained by configuring your package manager to use the Azure SDK Dev Feed from [here](https://github.com/Azure/azure-sdk-for-net/blob/main/CONTRIBUTING.md#nuget-package-dev-feed)
3833

39-
## Obtain your connection string
34+
## Install required NuGet packages
4035

41-
From the Azure portal, locate your Communication Service resource and click on the Keys section to obtain your connection string.
36+
Install the following NuGet packages to your project using the `dotnot add <package>` command.
4237

38+
*Azure.Communication.CallAutomation* - [Package details](https://dev.azure.com/azure-sdk/public/_artifacts/feed/azure-sdk-for-net/NuGet/Azure.Communication.CallAutomation/versions/)
39+
40+
*Azure.Messaging.EventGrid* - [Package details](https://dev.azure.com/azure-sdk/public/_artifacts/feed/azure-sdk-for-net/NuGet/Azure.Messaging.EventGrid/versions/)
41+
42+
## Obtain your connection string and phone number
43+
44+
From the Azure portal, locate your Communication Service resource.
45+
46+
1. Select on the Keys section to obtain your connection string.
4347
:::image type="content" source="./../../media/call-automation/Key.png" alt-text="Screenshot of Communication Services resource page on portal to access keys":::
48+
2. Then select on the Phone numbers section to obtain your ACS phone number.
4449

45-
## Configure Program.cs to answer the call
50+
## Update Program.cs
4651

4752
Using the minimal API feature in .NET 6, we can easily add an HTTP POST map and answer the call. A callback URI is required so the service knows how to contact your web server for subsequent calls state events such as `CallConnected` and `PlayCompleted`.
4853

49-
NOTE: The code sample also illustrates how you can control the callback URI by setting your own context/ID when you answer the call. All events generated by the call will be sent to the specific route you provide when answering an inbound call and the same applies to when you place an outbound call.
54+
In this code snippet, /api/incomingCall is the default route that will be used to listen for and answer incoming calls. At a later step, you'll register this url with Event Grid. Since Event Grid requires you to prove ownership of your Webhook endpoint before it starts delivering events to that endpoint, the code sample also handles this one time validation by processing SubscriptionValidationEvent. This requirement prevents a malicious user from flooding your endpoint with events. For more information, see this [guide](../../../../../event-grid/webhook-event-delivery.md).
55+
56+
The code sample also illustrates how you can control the callback URI by setting your own context/ID when you answer the call. All events generated by the call will be sent to the specific route you provide when answering an inbound call and the same applies to when you place an outbound call.
57+
5058
``` csharp
5159
using Azure.Communication;
5260
using Azure.Communication.CallAutomation;
5361
using Azure.Messaging;
5462
using Azure.Messaging.EventGrid;
5563
using Azure.Messaging.EventGrid.SystemEvents;
5664
using Microsoft.AspNetCore.Mvc;
65+
using System.ComponentModel.DataAnnotations;
5766
using System.Text.Json.Nodes;
5867

5968
var builder = WebApplication.CreateBuilder(args);
6069

61-
var client = new CallAutomationClient(builder.Configuration["ACS:ConnectionString"]);
62-
var callbackUriBase = "<YOUR_NGROK_FQDN>"; // i.e. https://someguid.ngrok.io
70+
var client = new CallAutomationClient(builder.Configuration["ConnectionString"]);
71+
var callbackUriBase = builder.Configuration["callbackUriBase"]; // i.e. https://someguid.ngrok.io
6372
6473
var app = builder.Build();
6574
app.MapPost("/api/incomingCall", async (
@@ -70,7 +79,7 @@ app.MapPost("/api/incomingCall", async (
7079
// Handle system events
7180
if (eventGridEvent.TryGetSystemEventData(out object eventData))
7281
{
73-
// Handle the subscription validation event
82+
// Handle the subscription validation event.
7483
if (eventData is SubscriptionValidationEventData subscriptionValidationEventData)
7584
{
7685
var responseData = new SubscriptionValidationResponse
@@ -81,16 +90,19 @@ app.MapPost("/api/incomingCall", async (
8190
}
8291
}
8392
var jsonObject = JsonNode.Parse(eventGridEvent.Data).AsObject();
93+
var callerId = (string)(jsonObject["from"]["rawId"]);
8494
var incomingCallContext = (string)jsonObject["incomingCallContext"];
85-
var callbackUri = new Uri(callbackUriBase + $"/api/calls/{Guid.NewGuid()}");
95+
var callbackUri = new Uri(callbackUriBase + $"/api/calls/{Guid.NewGuid()}?callerId={callerId}");
96+
8697
AnswerCallResult answerCallResult = await client.AnswerCallAsync(incomingCallContext, callbackUri);
8798
}
8899
return Results.Ok();
89100
});
90101

91102
app.MapPost("/api/calls/{contextId}", async (
92103
[FromBody] CloudEvent[] cloudEvents,
93-
[FromRoute] string contextId) =>
104+
[FromRoute] string contextId,
105+
[Required] string callerId) =>
94106
{
95107
foreach (var cloudEvent in cloudEvents)
96108
{
@@ -99,12 +111,12 @@ app.MapPost("/api/calls/{contextId}", async (
99111
{
100112
// play audio then recognize 3-digit DTMF input with pound (#) stop tone
101113
var recognizeOptions =
102-
new CallMediaRecognizeDtmfOptions(new PhoneNumberIdentifier("<Target-Participant-Phone-Number>"), 3)
114+
new CallMediaRecognizeDtmfOptions(CommunicationIdentifier.FromRawId(callerId), 3)
103115
{
104116
InterruptPrompt = true,
105117
InterToneTimeout = TimeSpan.FromSeconds(10),
106118
InitialSilenceTimeout = TimeSpan.FromSeconds(5),
107-
Prompt = new FileSource(new Uri("<INSERT_AUDIO_FILE_URI>")),
119+
Prompt = new FileSource(new Uri(builder.Configuration["MediaSource"])),
108120
StopTones = new[] { DtmfTone.Pound },
109121
OperationContext = "MainMenu"
110122
};
@@ -119,12 +131,51 @@ app.MapPost("/api/calls/{contextId}", async (
119131
.AddParticipantsAsync(new AddParticipantsOptions(
120132
new List<CommunicationIdentifier>()
121133
{
122-
new CommunicationUserIdentifier("<ACS_ID>")
123-
}));
134+
new CommunicationUserIdentifier(builder.Configuration["ParticipantToAdd"])
135+
})
136+
);
124137
}
125138
}
126139
return Results.Ok();
127140
}).Produces(StatusCodes.Status200OK);
128141

129142
app.Run();
130143
```
144+
145+
## Set up a public URI for the local application
146+
147+
In this quick-start, you'll use [Ngrok tool](https://ngrok.com/) to project a public URI to the local port so that your local application can be visited by the internet. The public URI is needed to receive the Event Grid `IncomingCall` event and Call Automation events using webhooks.
148+
149+
First, determine the port of the .NET application. Minimal API dynamically allocates a port for the project at the time of creation. Find out the http port in <PROJECT_ROOT>\Properties\launchSettings.json.
150+
:::image type="content" source="./../../media/call-automation/dotnet-application-port.jpg" alt-text="Screenshot of demo application's launchsetting.json file":::
151+
152+
Then, [install Ngrok](https://ngrok.com/download) and run Ngrok with the following command: `ngrok http <port>`. This command will create a public URI like `https://ff2f-75-155-253-232.ngrok.io/`, and it is your Ngrok Fully Qualified Domain Name(Ngrok_FQDN). Keep Ngrok running while following the rest of this quick-start.
153+
154+
## Set up environment variables
155+
156+
In Visual Studio, right click at your project and then select "Manage User Secrets" to configure confidential environment variables.
157+
158+
:::image type="content" source="./../../media/call-automation/dotnet-user-secret.jpg" alt-text="Screenshot of how to find out 'Manage User Secrets'":::
159+
160+
Read more about Secret Manager at [Safe storage of app secrets in development in ASP.NET Core](https://learn.microsoft.com/aspnet/core/security/app-secrets)
161+
162+
``` json
163+
{
164+
...
165+
"ConnectionString": "Your_ACS_resource_connection_string",
166+
"CallbackUriBase": "Your_Ngrok_FQDN",
167+
"MediaSource": "Link_to_media_file_for_play_prompt",
168+
"ParticipantToAdd": "The_participant_to_be_added_after_recognizing_tones"
169+
...
170+
}
171+
```
172+
173+
ParticipantToAdd used in the code snippet is assumed to be an ACS User MRI.
174+
175+
## Run the app
176+
177+
Open Your_Project_Name.csproj file in your project with Visual Studio, and then select Run button or press F5 on your keyboard.
178+
179+
## Set up IncomingCall event
180+
181+
IncomingCall is an Azure Event Grid event for notifying incoming calls to your Communication Services resource, like the phone number purchased in pre-requisites. Follow [this guide](../../../../how-tos/call-automation-sdk/subscribe-to-incoming-call.md) to set up your IncomingCall event.

0 commit comments

Comments
 (0)