diff --git a/libraries/Microsoft.Bot.Builder.Dialogs/Prompts/OAuthPrompt.cs b/libraries/Microsoft.Bot.Builder.Dialogs/Prompts/OAuthPrompt.cs
index cb4c4d8e93..15241622a8 100644
--- a/libraries/Microsoft.Bot.Builder.Dialogs/Prompts/OAuthPrompt.cs
+++ b/libraries/Microsoft.Bot.Builder.Dialogs/Prompts/OAuthPrompt.cs
@@ -153,7 +153,8 @@ public static async Task SendOAuthCardAsync(OAuthPromptSettings settings, ITurnC
cardActionType = ActionTypes.OpenUrl;
}
}
- else if (!ChannelRequiresSignInLink(turnContext.Activity.ChannelId))
+ else if ((settings.ShowSignInLink != null && settings.ShowSignInLink == false) ||
+ (settings.ShowSignInLink == null && !ChannelRequiresSignInLink(turnContext.Activity.ChannelId)))
{
value = null;
}
diff --git a/libraries/Microsoft.Bot.Builder.Dialogs/Prompts/OAuthPromptSettings.cs b/libraries/Microsoft.Bot.Builder.Dialogs/Prompts/OAuthPromptSettings.cs
index da55821a1d..0c434f8949 100644
--- a/libraries/Microsoft.Bot.Builder.Dialogs/Prompts/OAuthPromptSettings.cs
+++ b/libraries/Microsoft.Bot.Builder.Dialogs/Prompts/OAuthPromptSettings.cs
@@ -52,5 +52,12 @@ public class OAuthPromptSettings
/// True if the should automatically end upon receiving
/// an invalid message.
public bool EndOnInvalidMessage { get; set; }
+
+ ///
+ /// Gets or sets an optional boolean value to force the display of a Sign In link overriding
+ /// the default behavior.
+ ///
+ /// True to display the SignInLink.
+ public bool? ShowSignInLink { get; set; }
}
}
diff --git a/libraries/Microsoft.Bot.Builder/Adapters/TestAdapter.cs b/libraries/Microsoft.Bot.Builder/Adapters/TestAdapter.cs
index 20f1f412ff..aefc517a18 100644
--- a/libraries/Microsoft.Bot.Builder/Adapters/TestAdapter.cs
+++ b/libraries/Microsoft.Bot.Builder/Adapters/TestAdapter.cs
@@ -164,7 +164,10 @@ public async Task ProcessActivityAsync(Activity activity, BotCallbackHandler cal
activity.Type = ActivityTypes.Message;
}
- activity.ChannelId = Conversation.ChannelId;
+ if (activity.ChannelId == null)
+ {
+ activity.ChannelId = Conversation.ChannelId;
+ }
if (activity.From == null || activity.From.Id == "unknown" || activity.From.Role == RoleTypes.Bot)
{
diff --git a/tests/Microsoft.Bot.Builder.Dialogs.Tests/OAuthPromptTests.cs b/tests/Microsoft.Bot.Builder.Dialogs.Tests/OAuthPromptTests.cs
index 08e342c13b..ae49ff91c1 100644
--- a/tests/Microsoft.Bot.Builder.Dialogs.Tests/OAuthPromptTests.cs
+++ b/tests/Microsoft.Bot.Builder.Dialogs.Tests/OAuthPromptTests.cs
@@ -589,6 +589,57 @@ public async Task OAuthPromptRecognizeTokenAsync_WithNullTextMessageActivity_Doe
.StartTestAsync();
}
+ [Theory]
+ [InlineData(null, Channels.Test, false)] //Do not override; ChannelRequiresSingInLink() returns false; Result: no link
+ [InlineData(null, Channels.Msteams, true)] //Do not override; ChannelRequiresSingInLink() returns true; Result: show link
+ [InlineData(false, Channels.Test, false)] //Override: no link; ChannelRequiresSingInLink() returns false; Result: no link
+ [InlineData(true, Channels.Test, true)] //Override: show link; ChannelRequiresSingInLink() returns false; Result: show link
+ [InlineData(false, Channels.Msteams, false)] //Override: no link; ChannelRequiresSingInLink() returns true; Result: no link
+ [InlineData(true, Channels.Msteams, true)] //Override: show link; ChannelRequiresSingInLink() returns true; Result: show link
+ public async Task OAuthPromptSignInLinkSettingsCases(bool? showSignInLinkValue, string channelId, bool shouldHaveSignInLink)
+ {
+ var oAuthPromptSettings = new OAuthPromptSettings();
+ oAuthPromptSettings.ShowSignInLink = showSignInLinkValue;
+
+ var convoState = new ConversationState(new MemoryStorage());
+ var dialogState = convoState.CreateProperty("dialogState");
+
+ var adapter = new TestAdapter()
+ .Use(new AutoSaveStateMiddleware(convoState));
+
+ // Create new DialogSet
+ var dialogs = new DialogSet(dialogState);
+ dialogs.Add(new OAuthPrompt("OAuthPrompt", oAuthPromptSettings));
+
+ BotCallbackHandler botCallbackHandler = async (turnContext, cancellationToken) =>
+ {
+ var dc = await dialogs.CreateContextAsync(turnContext, cancellationToken);
+
+ var results = await dc.ContinueDialogAsync(cancellationToken);
+ if (results.Status == DialogTurnStatus.Empty)
+ {
+ await dc.PromptAsync("OAuthPrompt", new PromptOptions(), cancellationToken: cancellationToken);
+ }
+ };
+
+ var initialActivity = new Activity()
+ {
+ ChannelId = channelId,
+ Text = "hello"
+ };
+ await new TestFlow(adapter, botCallbackHandler)
+ .Send(initialActivity)
+ .AssertReply(activity =>
+ {
+ Assert.Single(((Activity)activity).Attachments);
+ Assert.Equal(OAuthCard.ContentType, ((Activity)activity).Attachments[0].ContentType);
+ var oAuthCard = (OAuthCard)((Activity)activity).Attachments[0].Content;
+ var cardAction = oAuthCard.Buttons[0];
+ Assert.Equal(shouldHaveSignInLink, cardAction.Value != null);
+ })
+ .StartTestAsync();
+ }
+
private async Task OAuthPrompt(IStorage storage)
{
var convoState = new ConversationState(storage);