From 5eec784720480b9ef283ebbc9c8a42fc5533d1a2 Mon Sep 17 00:00:00 2001 From: Darren Jefford Date: Tue, 28 May 2019 07:43:03 +0100 Subject: [PATCH 1/4] Defensive for oauthprompt bug --- .../Authentication/MultiProviderAuthDialog.cs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/csharp/microsoft.bot.builder.solutions/microsoft.bot.builder.solutions/Authentication/MultiProviderAuthDialog.cs b/lib/csharp/microsoft.bot.builder.solutions/microsoft.bot.builder.solutions/Authentication/MultiProviderAuthDialog.cs index 001da348de..2c52225a7b 100644 --- a/lib/csharp/microsoft.bot.builder.solutions/microsoft.bot.builder.solutions/Authentication/MultiProviderAuthDialog.cs +++ b/lib/csharp/microsoft.bot.builder.solutions/microsoft.bot.builder.solutions/Authentication/MultiProviderAuthDialog.cs @@ -246,14 +246,19 @@ private Task AuthPromptValidatorAsync(PromptValidatorContext Date: Tue, 28 May 2019 11:50:41 +0100 Subject: [PATCH 2/4] doc updates for local model deployment, extra trace for misconfigured scenario --- .../reference/skills/productivity-calendar.md | 69 +++++++++--- docs/reference/skills/productivity-email.md | 100 +++++++++++++----- docs/reference/skills/productivity-todo.md | 100 +++++++++++------- .../Authentication/MultiProviderAuthDialog.cs | 18 +++- 4 files changed, 201 insertions(+), 86 deletions(-) diff --git a/docs/reference/skills/productivity-calendar.md b/docs/reference/skills/productivity-calendar.md index a26dab731d..20f0816523 100644 --- a/docs/reference/skills/productivity-calendar.md +++ b/docs/reference/skills/productivity-calendar.md @@ -9,6 +9,10 @@ The most common scenarios have been implemented in this beta release, with addit - [Language Model](#language-model) - [Configuration](#configuration) +## Supported Sources + +> Office 365 and Outlook.com through the Microsoft Graph is supported along with support for Google accounts. + ## Supported Scenarios The following scenarios are currently supported by the Skill: @@ -57,7 +61,7 @@ The following scenarios are currently supported by the Skill: - *How long until my next meeting?* - *How many days are there until Thanksgiving?* -### Skill Deployment +## Skill Deployment The Calendar Skill require the following dependencies for end to end operation which are created through an ARM deployment script which you can modify as required. @@ -73,11 +77,54 @@ The Calendar Skill require the following dependencies for end to end operation w ### Authentication Connection Settings -Your Authentication Connection and corresponding Application Registration should have the following Scopes added, these will be added automatically as part of Skill configuration where possible. - -- `User.Read` +If you plan to use the skill as part of a Virtual Assistant the process of registering a skill with your Virtual Assistant will create the supporting authentication connection information automatically for your Virtual Assistant. This skill uses the following authentication scopes which are registered automatically: +- `User.ReadBasic.All` - `Calendars.ReadWrite` -- `People.Read` +- `People.Read` +- `Contacts.Read` + +> Only required if you wish to use the Skill directly and not as part of a Virtual Assistant. + +**However**, if you wish to use the Skill directly without using a Virtual Assistant please use the following steps to manually configure Authentication for the Calendar Skill. This is **not** required when using the Skill with a Virtual Assistant. + +If you wish to make use of the Calendar, Email and Task Skills you need to configure an Authentication Connection enabling uses of your Assistant to authenticate against services such as Office 365 and securely store a token which can be retrieved by your assistant when a user asks a question such as *"What does my day look like today"* to then use against an API like Microsoft Graph. + +The [Add Authentication to your bot](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-tutorial-authentication?view=azure-bot-service-3.0) section in the Azure Bot Service documentation covers more detail on how to configure Authentication. However in this scenario, the automated deployment step has already created the **Azure AD v2 Application** for your Bot and you instead need to follow these instructions: + +- Navigate to the Azure Portal, Click Azure Active Directory and then `App Registrations` +- Find the Application that's been created for your Bot as part of the deployment. You can search for the application by name or ApplicationID as part of the experience but note that search only works across applications currently shown and the one you need may be on a separate page. +- Click API permissions on the left-hand navigation + - Select Add Permission to show the permissions pane + - Select `Microsoft Graph` + - Select Delegated Permissions and then add each of the following permissions required for the Productivity Skills: + - `User.ReadBasic.All` + - `Calendars.ReadWrite` + - `People.Read` + - `Contacts.Read` + - Click Add Permissions at the bottom to apply the changes. + +Next you need to create the Authentication Connection for your Bot. Within the Azure Portal, find the `Web App Bot` resource created when your deployed your Bot and choose `Settings`. + +- Scroll down to the oAuth Connection settings section. +- Click `Add Setting` +- Type in the name of your Connection Setting - e.g. `Outlook` +- Choose `Azure Active Directory v2` from the Service Provider drop-down +- Open the `appSettings.config` file for your Skill + - Copy/Paste the value of `microsoftAppId` into the ClientId setting + - Copy/Paste the value of `microsoftAppPassword` into the Client Secret setting + - Set Tenant Id to common + - Set scopes to `User.ReadBasic.All, Calendars.ReadWrite, People.Read, Contacts.Read` + +Finally, open the `appSettings.config` file for your Calendar Skill and update the connection name to match the one provided in the previous step. + +``` +"oauthConnections": [ + { + "name": "Outlook", + "provider": "Azure Active Directory v2" + } + ], +``` ## Language Model @@ -138,15 +185,3 @@ LUIS models for the Skill are provided in .LU file format as part of the Skill. |datetimeV2| Prebuilt entity| |number| Prebuilt entity| |ordinal| Prebuilt entity| - -## Configuration - -### Supported Sources - -> Office 365 and Outlook.com through the Microsoft Graph is supported along with support for Google accounts. - -### Example Skill Manifest - -``` -TBC -``` diff --git a/docs/reference/skills/productivity-email.md b/docs/reference/skills/productivity-email.md index 211c84485c..b5478cb938 100644 --- a/docs/reference/skills/productivity-email.md +++ b/docs/reference/skills/productivity-email.md @@ -9,6 +9,10 @@ The most common scenarios have been implemented in this beta release, with addit - [Language Model](#language-model) - [Configuration](#configuration) +## Supported Sources + +> Office 365 and Outlook.com through the Microsoft Graph is supported along with support for Google accounts. + ## Supported Scenarios The following scenarios are currently supported by the Skill: @@ -44,6 +48,73 @@ The following scenarios are currently supported by the Skill: - *The third search result please* - *Open this one* +## Skill Deployment + +The Email Skill require the following dependencies for end to end operation which are created through an ARM script which you can modify as required. + +- Azure Web App +- Azure Storage Account (Transcripts) +- Azure Application Insights (Telemetry) +- Azure CosmosDb (State) +- Azure Cognitive Services - Language Understanding + +> Review the pricing and terms for the services and adjust to suit your scenario. + +To deploy your services using the default configuration, follow the steps in this common [deployment documentation page](/docs/tutorials/assistantandskilldeploymentsteps.md) from the folder where your have cloned the GitHub repo. + +### Authentication Connection Settings + +If you plan to use the skill as part of a Virtual Assistant the process of registering a skill with your Virtual Assistant will create the supporting authentication connection information automatically for your Virtual Assistant. This skill uses the following authentication scopes which are registered automatically: +- `User.ReadBasic.All` +- `Mail.ReadWrite` +- `Mail.Send` +- `People.Read` +- `Contacts.Read` + +> Only required if you wish to use the Skill directly and not as part of a Virtual Assistant. + +**However**, if you wish to use the Skill directly without using a Virtual Assistant please use the following steps to manually configure Authentication for the Email Skill. This is **not** required when using the Skill with a Virtual Assistant. + +If you wish to make use of the Calendar, Email and Task Skills you need to configure an Authentication Connection enabling uses of your Assistant to authenticate against services such as Office 365 and securely store a token which can be retrieved by your assistant when a user asks a question such as *"What does my day look like today"* to then use against an API like Microsoft Graph. + +The [Add Authentication to your bot](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-tutorial-authentication?view=azure-bot-service-3.0) section in the Azure Bot Service documentation covers more detail on how to configure Authentication. However in this scenario, the automated deployment step has already created the **Azure AD v2 Application** for your Bot and you instead need to follow these instructions: + +- Navigate to the Azure Portal, Click Azure Active Directory and then `App Registrations` +- Find the Application that's been created for your Bot as part of the deployment. You can search for the application by name or ApplicationID as part of the experience but note that search only works across applications currently shown and the one you need may be on a separate page. +- Click API permissions on the left-hand navigation + - Select Add Permission to show the permissions pane + - Select `Microsoft Graph` + - Select Delegated Permissions and then add each of the following permissions required for the Productivity Skills: + - `User.ReadBasic.All` + - `Mail.ReadWrite` + - `Mail.Send` + - `People.Read` + - `Contacts.Read` + - Click Add Permissions at the bottom to apply the changes. + +Next you need to create the Authentication Connection for your Bot. Within the Azure Portal, find the `Web App Bot` resource created when your deployed your Bot and choose `Settings`. + +- Scroll down to the oAuth Connection settings section. +- Click `Add Setting` +- Type in the name of your Connection Setting - e.g. `Outlook` +- Choose `Azure Active Directory v2` from the Service Provider drop-down +- Open the `appSettings.config` file for your Skill + - Copy/Paste the value of `microsoftAppId` into the ClientId setting + - Copy/Paste the value of `microsoftAppPassword` into the Client Secret setting + - Set Tenant Id to common + - Set scopes to `User.ReadBasic.All Mail.ReadWrite Mail.Send People.Read Contacts.Read` + +Finally, open the `appSettings.config` file for your Email Skill and update the connection name to match the one provided in the previous step. + +``` +"oauthConnections": [ + { + "name": "Outlook", + "provider": "Azure Active Directory v2" + } + ], +``` + ## Language Model LUIS models for the Skill are provided in .LU file format as part of the Skill. Further languages are being prioritized. @@ -96,35 +167,6 @@ LUIS models for the Skill are provided in .LU file format as part of the Skill. |number| Prebuilt entity| |ordinal| Prebuilt entity| -## Configuration - -### Supported Sources - -> Office 365 and Outlook.com through the Microsoft Graph is supported along with support for Google accounts. - -### Skill Deployment - -The Email Skill require the following dependencies for end to end operation which are created through an ARM script which you can modify as required. - -- Azure Web App -- Azure Storage Account (Transcripts) -- Azure Application Insights (Telemetry) -- Azure CosmosDb (State) -- Azure Cognitive Services - Language Understanding - -> Review the pricing and terms for the services and adjust to suit your scenario. - -To deploy your services using the default configuration, follow the steps in this common [deployment documentation page](/docs/tutorials/assistantandskilldeploymentsteps.md) from the folder where your have cloned the GitHub repo. - -### Authentication Connection Settings - -Your Authentication Connection and corresponding Application Registration should have the following Scopes added, these will be added automatically as part of Skill configuration where possible. - -- `User.Read` -- `Mail.Read` -- `Mail.Send` -- `People.Read` - ### Example Skill Manifest ``` diff --git a/docs/reference/skills/productivity-todo.md b/docs/reference/skills/productivity-todo.md index 9afc524170..d02f02a500 100644 --- a/docs/reference/skills/productivity-todo.md +++ b/docs/reference/skills/productivity-todo.md @@ -3,11 +3,9 @@ The ToDo Skill provides ToDo related capabilities to a Virtual Assistant. The most common scenarios have been implemented in this beta release, with additional scenarios in development. -## Table of Contents +### Supported Sources -- [Supported Scenarios](#supported-scenarios) -- [Language Model](#language-model) -- [Configuration](#configuration) +> Office 365 and Outlook.com through the Microsoft Graph is supported at this time. Additional sources will be coming in a future release. ## Supported Scenarios @@ -30,6 +28,68 @@ The following scenarios are currently supported by the Skill: - *Task completed "reserve a restaurant for anniversary"* - *Check off "bananas" on my grocery list* +## Skill Deployment + +The ToDo Skill require the following dependencies for end to end operation which are created through an ARM script which you can modify as required. + +- Azure Web App +- Azure Storage Account (Transcripts) +- Azure Application Insights (Telemetry) +- Azure CosmosDb (State) +- Azure Cognitive Services - Language Understanding + +> Review the pricing and terms for the services and adjust to suit your scenario. + +To deploy your services using the default configuration, follow the steps in this common [deployment documentation page](/docs/tutorials/assistantandskilldeploymentsteps.md) from the folder where your have cloned the GitHub repo. + +### Authentication Connection Settings + +If you plan to use the skill as part of a Virtual Assistant the process of registering a skill with your Virtual Assistant will create the supporting authentication connection information automatically for your Virtual Assistant. This skill uses the following authentication scopes which are registered automatically: +- `Notes.ReadWrite` +- `User.ReadBasic.All` +- `Tasks.ReadWrite` + +**However**, if you wish to use the Skill directly without using a Virtual Assistant please use the following steps to manually configure Authentication for the ToDo Skill. This is **not** required when using the Skill with a Virtual Assistant. + +If you wish to make use of the Calendar, Email and Task Skills you need to configure an Authentication Connection enabling uses of your Assistant to authenticate against services such as Office 365 and securely store a token which can be retrieved by your assistant when a user asks a question such as *"What does my day look like today"* to then use against an API like Microsoft Graph. + +The [Add Authentication to your bot](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-tutorial-authentication?view=azure-bot-service-3.0) section in the Azure Bot Service documentation covers more detail on how to configure Authentication. However in this scenario, the automated deployment step has already created the **Azure AD v2 Application** for your Bot and you instead need to follow these instructions: + +- Navigate to the Azure Portal, Click Azure Active Directory and then `App Registrations` +- Find the Application that's been created for your Bot as part of the deployment. You can search for the application by name or ApplicationID as part of the experience but note that search only works across applications currently shown and the one you need may be on a separate page. +- Click API permissions on the left-hand navigation + - Select Add Permission to show the permissions pane + - Select `Microsoft Graph` + - Select Delegated Permissions and then add each of the following permissions required for the Productivity Skills: + - `Notes.ReadWrite` + - `User.ReadBasic.All` + - `Tasks.ReadWrite` + - Click Add Permissions at the bottom to apply the changes. + +Next you need to create the Authentication Connection for your Bot. Within the Azure Portal, find the `Web App Bot` resource created when your deployed your Bot and choose `Settings`. + +- Scroll down to the oAuth Connection settings section. +- Click `Add Setting` +- Type in the name of your Connection Setting - e.g. `Outlook` +- Choose `Azure Active Directory v2` from the Service Provider drop-down +- Open the `appSettings.config` file for your Skill + - Copy/Paste the value of `microsoftAppId` into the ClientId setting + - Copy/Paste the value of `microsoftAppPassword` into the Client Secret setting + - Set Tenant Id to common + - Set scopes to `Notes.ReadWrite, User.ReadBasic.All, Tasks.ReadWrite` + +Finally, open the `appSettings.config` file for your ToDo Skill and update the connection name to match the one provided in the previous step. + +``` +"oauthConnections": [ + { + "name": "Outlook", + "provider": "Azure Active Directory v2" + } + ], +``` + + ## Language Model LUIS models for the Skill are provided in .LU file format as part of the Skill. Further languages are being prioritized. @@ -65,35 +125,3 @@ LUIS models for the Skill are provided in .LU file format as part of the Skill. |TaskContentPattern| Pattern.any | |number| Prebuilt entity| |ordinal| Prebuilt entity| - -## Configuration - -### Supported Sources - -> Office 365 and Outlook.com through the Microsoft Graph is supported at this time. Additional sources will be coming in a future release. - -### Skill Deployment - -The ToDo Skill require the following dependencies for end to end operation which are created through an ARM script which you can modify as required. - -- Azure Web App -- Azure Storage Account (Transcripts) -- Azure Application Insights (Telemetry) -- Azure CosmosDb (State) -- Azure Cognitive Services - Language Understanding - -> Review the pricing and terms for the services and adjust to suit your scenario. - -To deploy your services using the default configuration, follow the steps in this common [deployment documentation page](/docs/tutorials/assistantandskilldeploymentsteps.md) from the folder where your have cloned the GitHub repo. - -### Authentication Connection Settings - -Your Authentication Connection and corresponding Application Registration should have the following Scopes added, these will be added automatically as part of Skill configuration where possible. - -- `Notes.ReadWrite` - -### Example Skill Manifest - -``` -TBC -``` \ No newline at end of file diff --git a/lib/csharp/microsoft.bot.builder.solutions/microsoft.bot.builder.solutions/Authentication/MultiProviderAuthDialog.cs b/lib/csharp/microsoft.bot.builder.solutions/microsoft.bot.builder.solutions/Authentication/MultiProviderAuthDialog.cs index 2c52225a7b..6adc787bdd 100644 --- a/lib/csharp/microsoft.bot.builder.solutions/microsoft.bot.builder.solutions/Authentication/MultiProviderAuthDialog.cs +++ b/lib/csharp/microsoft.bot.builder.solutions/microsoft.bot.builder.solutions/Authentication/MultiProviderAuthDialog.cs @@ -16,6 +16,7 @@ public class MultiProviderAuthDialog : ComponentDialog private string _selectedAuthType = string.Empty; private List _authenticationConnections; private ResponseManager _responseManager; + private bool localAuthConfigured = false; public MultiProviderAuthDialog(List authenticationConnections) : base(nameof(MultiProviderAuthDialog)) @@ -73,11 +74,13 @@ public MultiProviderAuthDialog(List authenticationConnections) } } - // Only add Auth supporting local auth dialogs if we found valid authentication connections to use + // Only add Auth supporting local auth dialogs if we found valid authentication connections to use otherwise it will just work in remote mode. if (authDialogAdded) { AddDialog(new WaterfallDialog(DialogIds.LocalAuthPrompt, localAuth)); AddDialog(new ChoicePrompt(DialogIds.ProviderPrompt) { Style = ListStyle.SuggestedAction }); + + localAuthConfigured = true; } } } @@ -104,7 +107,14 @@ private async Task FirstStepAsync(WaterfallStepContext stepCon } else { - return await stepContext.BeginDialogAsync(DialogIds.LocalAuthPrompt).ConfigureAwait(false); + if (localAuthConfigured) + { + return await stepContext.BeginDialogAsync(DialogIds.LocalAuthPrompt).ConfigureAwait(false); + } + else + { + throw new Exception("Local authentication is not configured, please check the authentication connection section in your configuration file."); + } } } @@ -119,7 +129,7 @@ private async Task SendRemoteEventAsync(WaterfallStepContext s } else { - throw new Exception("The adapter does not support RemoteTokenRequest!"); + throw new Exception("The adapter does not support RemoteTokenRequest."); } } @@ -132,7 +142,7 @@ private async Task ReceiveRemoteEventAsync(WaterfallStepContex } else { - throw new Exception("something wrong with the token response"); + throw new Exception("Token Response is invalid."); } } From f1bc0c77d33cc029b2321cc8e9d76b66c0aed981 Mon Sep 17 00:00:00 2001 From: Darren Jefford Date: Tue, 28 May 2019 13:23:17 +0100 Subject: [PATCH 3/4] capitalisation --- .../Authentication/MultiProviderAuthDialog.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/csharp/microsoft.bot.builder.solutions/microsoft.bot.builder.solutions/Authentication/MultiProviderAuthDialog.cs b/lib/csharp/microsoft.bot.builder.solutions/microsoft.bot.builder.solutions/Authentication/MultiProviderAuthDialog.cs index 6adc787bdd..e06a97be4f 100644 --- a/lib/csharp/microsoft.bot.builder.solutions/microsoft.bot.builder.solutions/Authentication/MultiProviderAuthDialog.cs +++ b/lib/csharp/microsoft.bot.builder.solutions/microsoft.bot.builder.solutions/Authentication/MultiProviderAuthDialog.cs @@ -65,8 +65,8 @@ public MultiProviderAuthDialog(List authenticationConnections) new OAuthPromptSettings { ConnectionName = connection.Name, - Title = "login", - Text = string.Format("login with {0}", connection.Name), + Title = "Login", + Text = string.Format("Login with {0}", connection.Name), }, AuthPromptValidatorAsync)); From f99b34ef3ec66bf65f1f7598ca6cde99f32ad769 Mon Sep 17 00:00:00 2001 From: Darren Jefford Date: Wed, 29 May 2019 08:56:09 +0100 Subject: [PATCH 4/4] update to docs --- docs/media/manualauthconnection.png | Bin 0 -> 56157 bytes docs/reference/skills/manualauthsteps.md | 40 ++++++++++++++++ .../reference/skills/productivity-calendar.md | 44 ++---------------- docs/reference/skills/productivity-email.md | 44 +----------------- docs/reference/skills/productivity-todo.md | 41 +--------------- 5 files changed, 47 insertions(+), 122 deletions(-) create mode 100644 docs/media/manualauthconnection.png create mode 100644 docs/reference/skills/manualauthsteps.md diff --git a/docs/media/manualauthconnection.png b/docs/media/manualauthconnection.png new file mode 100644 index 0000000000000000000000000000000000000000..2f685e52f2be87ee60df2e5761706f5bac40045b GIT binary patch literal 56157 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

V0KD?e%}ox_VrVn< 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 literal 0 HcmV?d00001 diff --git a/docs/reference/skills/manualauthsteps.md b/docs/reference/skills/manualauthsteps.md new file mode 100644 index 0000000000..9ec70cef74 --- /dev/null +++ b/docs/reference/skills/manualauthsteps.md @@ -0,0 +1,40 @@ +# Manual Authentication Configuration steps for Productivity Skills in local-mode only + +If you wish to make use of the Calendar, Email and Task Skills standalone to the Virtual Assistant (local mode) you need to configure an Authentication Connection enabling use of your Assistant to authenticate against services such as Office 365 and securely store a token which can be retrieved by your assistant when a user asks a question such as *"What does my day look like today"* to then use against an API like Microsoft Graph. + +> These steps are not required if you plan to use the productivity skills as part of the Virtual Assistant, these steps are performed automatically when you add a Skill to your assistant. + +The [Add Authentication to your bot](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-authentication?view=azure-bot-service-4.0&tabs=aadv1%2Ccsharp%2Cbot-oauth) section in the Azure Bot Service documentation covers more detail on how to configure Authentication. However in this scenario, the automated deployment step for the Skill has already created the **Azure AD v2 Application** for your Bot and you instead only need to follow these instructions: + +- Navigate to the Azure Portal, Click Azure Active Directory and then `App Registrations` +- Find the Application that's been created for your Bot as part of the deployment. You can search for the application by name or ApplicationID as part of the experience but note that search only works across applications currently shown and the one you need may be on a separate page. +- Click API permissions on the left-hand navigation + - Select Add Permission to show the permissions pane + - Select `Microsoft Graph` + - Select Delegated Permissions and then add each of the following permissions required for the Productivity Skills you are adding (see the specific documentation page for the specific scopes required.) + - Click Add Permissions at the bottom to apply the changes. + +Next you need to create the Authentication Connection for your Bot. Within the Azure Portal, find the `Web App Bot` resource created when your deployed your Bot and choose `Settings`. + +- Scroll down to the oAuth Connection settings section. +- Click `Add Setting` +- Type in the name of your Connection Setting - e.g. `Outlook` +- Choose `Azure Active Directory v2` from the Service Provider drop-down +- Open the `appSettings.config` file for your Skill + - Copy/Paste the value of `microsoftAppId` into the ClientId setting + - Copy/Paste the value of `microsoftAppPassword` into the Client Secret setting + - Set Tenant Id to common + - Set scopes to match the ones provided in the earlier step. + +![Manual Auth Connection](/docs/media/manualauthconnection.png) + +Finally, open the `appSettings.config` file for your Skill and update the connection name to match the one provided in the previous step. + +``` +"oauthConnections": [ + { + "name": "Outlook", + "provider": "Azure Active Directory v2" + } + ], +``` \ No newline at end of file diff --git a/docs/reference/skills/productivity-calendar.md b/docs/reference/skills/productivity-calendar.md index 20f0816523..66ed0d61c7 100644 --- a/docs/reference/skills/productivity-calendar.md +++ b/docs/reference/skills/productivity-calendar.md @@ -78,53 +78,15 @@ The Calendar Skill require the following dependencies for end to end operation w ### Authentication Connection Settings If you plan to use the skill as part of a Virtual Assistant the process of registering a skill with your Virtual Assistant will create the supporting authentication connection information automatically for your Virtual Assistant. This skill uses the following authentication scopes which are registered automatically: + - `User.ReadBasic.All` - `Calendars.ReadWrite` - `People.Read` - `Contacts.Read` -> Only required if you wish to use the Skill directly and not as part of a Virtual Assistant. - **However**, if you wish to use the Skill directly without using a Virtual Assistant please use the following steps to manually configure Authentication for the Calendar Skill. This is **not** required when using the Skill with a Virtual Assistant. -If you wish to make use of the Calendar, Email and Task Skills you need to configure an Authentication Connection enabling uses of your Assistant to authenticate against services such as Office 365 and securely store a token which can be retrieved by your assistant when a user asks a question such as *"What does my day look like today"* to then use against an API like Microsoft Graph. - -The [Add Authentication to your bot](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-tutorial-authentication?view=azure-bot-service-3.0) section in the Azure Bot Service documentation covers more detail on how to configure Authentication. However in this scenario, the automated deployment step has already created the **Azure AD v2 Application** for your Bot and you instead need to follow these instructions: - -- Navigate to the Azure Portal, Click Azure Active Directory and then `App Registrations` -- Find the Application that's been created for your Bot as part of the deployment. You can search for the application by name or ApplicationID as part of the experience but note that search only works across applications currently shown and the one you need may be on a separate page. -- Click API permissions on the left-hand navigation - - Select Add Permission to show the permissions pane - - Select `Microsoft Graph` - - Select Delegated Permissions and then add each of the following permissions required for the Productivity Skills: - - `User.ReadBasic.All` - - `Calendars.ReadWrite` - - `People.Read` - - `Contacts.Read` - - Click Add Permissions at the bottom to apply the changes. - -Next you need to create the Authentication Connection for your Bot. Within the Azure Portal, find the `Web App Bot` resource created when your deployed your Bot and choose `Settings`. - -- Scroll down to the oAuth Connection settings section. -- Click `Add Setting` -- Type in the name of your Connection Setting - e.g. `Outlook` -- Choose `Azure Active Directory v2` from the Service Provider drop-down -- Open the `appSettings.config` file for your Skill - - Copy/Paste the value of `microsoftAppId` into the ClientId setting - - Copy/Paste the value of `microsoftAppPassword` into the Client Secret setting - - Set Tenant Id to common - - Set scopes to `User.ReadBasic.All, Calendars.ReadWrite, People.Read, Contacts.Read` - -Finally, open the `appSettings.config` file for your Calendar Skill and update the connection name to match the one provided in the previous step. - -``` -"oauthConnections": [ - { - "name": "Outlook", - "provider": "Azure Active Directory v2" - } - ], -``` +Follow the general instructions [here](/docs/reference/skills/manualauthsteps.md) to configure this using the scopes shown above. ## Language Model @@ -184,4 +146,4 @@ LUIS models for the Skill are provided in .LU file format as part of the Skill. |ToTime| Simple entity| |datetimeV2| Prebuilt entity| |number| Prebuilt entity| -|ordinal| Prebuilt entity| +|ordinal| Prebuilt entity| \ No newline at end of file diff --git a/docs/reference/skills/productivity-email.md b/docs/reference/skills/productivity-email.md index b5478cb938..8a17ee5002 100644 --- a/docs/reference/skills/productivity-email.md +++ b/docs/reference/skills/productivity-email.md @@ -71,49 +71,9 @@ If you plan to use the skill as part of a Virtual Assistant the process of regis - `People.Read` - `Contacts.Read` -> Only required if you wish to use the Skill directly and not as part of a Virtual Assistant. +**However**, if you wish to use the Skill directly without using a Virtual Assistant please use the following steps to manually configure Authentication for the Calendar Skill. This is **not** required when using the Skill with a Virtual Assistant. -**However**, if you wish to use the Skill directly without using a Virtual Assistant please use the following steps to manually configure Authentication for the Email Skill. This is **not** required when using the Skill with a Virtual Assistant. - -If you wish to make use of the Calendar, Email and Task Skills you need to configure an Authentication Connection enabling uses of your Assistant to authenticate against services such as Office 365 and securely store a token which can be retrieved by your assistant when a user asks a question such as *"What does my day look like today"* to then use against an API like Microsoft Graph. - -The [Add Authentication to your bot](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-tutorial-authentication?view=azure-bot-service-3.0) section in the Azure Bot Service documentation covers more detail on how to configure Authentication. However in this scenario, the automated deployment step has already created the **Azure AD v2 Application** for your Bot and you instead need to follow these instructions: - -- Navigate to the Azure Portal, Click Azure Active Directory and then `App Registrations` -- Find the Application that's been created for your Bot as part of the deployment. You can search for the application by name or ApplicationID as part of the experience but note that search only works across applications currently shown and the one you need may be on a separate page. -- Click API permissions on the left-hand navigation - - Select Add Permission to show the permissions pane - - Select `Microsoft Graph` - - Select Delegated Permissions and then add each of the following permissions required for the Productivity Skills: - - `User.ReadBasic.All` - - `Mail.ReadWrite` - - `Mail.Send` - - `People.Read` - - `Contacts.Read` - - Click Add Permissions at the bottom to apply the changes. - -Next you need to create the Authentication Connection for your Bot. Within the Azure Portal, find the `Web App Bot` resource created when your deployed your Bot and choose `Settings`. - -- Scroll down to the oAuth Connection settings section. -- Click `Add Setting` -- Type in the name of your Connection Setting - e.g. `Outlook` -- Choose `Azure Active Directory v2` from the Service Provider drop-down -- Open the `appSettings.config` file for your Skill - - Copy/Paste the value of `microsoftAppId` into the ClientId setting - - Copy/Paste the value of `microsoftAppPassword` into the Client Secret setting - - Set Tenant Id to common - - Set scopes to `User.ReadBasic.All Mail.ReadWrite Mail.Send People.Read Contacts.Read` - -Finally, open the `appSettings.config` file for your Email Skill and update the connection name to match the one provided in the previous step. - -``` -"oauthConnections": [ - { - "name": "Outlook", - "provider": "Azure Active Directory v2" - } - ], -``` +Follow the general instructions [here](/docs/reference/skills/manualauthsteps.md) to configure this using the scopes shown above. ## Language Model diff --git a/docs/reference/skills/productivity-todo.md b/docs/reference/skills/productivity-todo.md index d02f02a500..701f57db8e 100644 --- a/docs/reference/skills/productivity-todo.md +++ b/docs/reference/skills/productivity-todo.md @@ -49,46 +49,9 @@ If you plan to use the skill as part of a Virtual Assistant the process of regis - `User.ReadBasic.All` - `Tasks.ReadWrite` -**However**, if you wish to use the Skill directly without using a Virtual Assistant please use the following steps to manually configure Authentication for the ToDo Skill. This is **not** required when using the Skill with a Virtual Assistant. - -If you wish to make use of the Calendar, Email and Task Skills you need to configure an Authentication Connection enabling uses of your Assistant to authenticate against services such as Office 365 and securely store a token which can be retrieved by your assistant when a user asks a question such as *"What does my day look like today"* to then use against an API like Microsoft Graph. - -The [Add Authentication to your bot](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-tutorial-authentication?view=azure-bot-service-3.0) section in the Azure Bot Service documentation covers more detail on how to configure Authentication. However in this scenario, the automated deployment step has already created the **Azure AD v2 Application** for your Bot and you instead need to follow these instructions: - -- Navigate to the Azure Portal, Click Azure Active Directory and then `App Registrations` -- Find the Application that's been created for your Bot as part of the deployment. You can search for the application by name or ApplicationID as part of the experience but note that search only works across applications currently shown and the one you need may be on a separate page. -- Click API permissions on the left-hand navigation - - Select Add Permission to show the permissions pane - - Select `Microsoft Graph` - - Select Delegated Permissions and then add each of the following permissions required for the Productivity Skills: - - `Notes.ReadWrite` - - `User.ReadBasic.All` - - `Tasks.ReadWrite` - - Click Add Permissions at the bottom to apply the changes. - -Next you need to create the Authentication Connection for your Bot. Within the Azure Portal, find the `Web App Bot` resource created when your deployed your Bot and choose `Settings`. - -- Scroll down to the oAuth Connection settings section. -- Click `Add Setting` -- Type in the name of your Connection Setting - e.g. `Outlook` -- Choose `Azure Active Directory v2` from the Service Provider drop-down -- Open the `appSettings.config` file for your Skill - - Copy/Paste the value of `microsoftAppId` into the ClientId setting - - Copy/Paste the value of `microsoftAppPassword` into the Client Secret setting - - Set Tenant Id to common - - Set scopes to `Notes.ReadWrite, User.ReadBasic.All, Tasks.ReadWrite` - -Finally, open the `appSettings.config` file for your ToDo Skill and update the connection name to match the one provided in the previous step. - -``` -"oauthConnections": [ - { - "name": "Outlook", - "provider": "Azure Active Directory v2" - } - ], -``` +**However**, if you wish to use the Skill directly without using a Virtual Assistant please use the following steps to manually configure Authentication for the Calendar Skill. This is **not** required when using the Skill with a Virtual Assistant. +Follow the general instructions [here](/docs/reference/skills/manualauthsteps.md) to configure this using the scopes shown above. ## Language Model