protected override async Task <MessagingExtensionActionResponse> OnTeamsMessagingExtensionFetchTaskAsync(ITurnContext <IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken) { if (action.CommandId.ToUpper() == "SHOWPROFILE") { var state = action.State; // Check the state value var tokenResponse = await GetTokenResponse(turnContext, state, cancellationToken); if (tokenResponse == null || string.IsNullOrEmpty(tokenResponse.Token)) { // There is no token, so the user has not signed in yet. // Retrieve the OAuth Sign in Link to use in the MessagingExtensionResult Suggested Actions var signInLink = await(turnContext.Adapter as IUserTokenProvider).GetOauthSignInLinkAsync(turnContext, _connectionName, cancellationToken); return(new MessagingExtensionActionResponse { ComposeExtension = new MessagingExtensionResult { Type = "auth", SuggestedActions = new MessagingExtensionSuggestedAction { Actions = new List <CardAction> { new CardAction { Type = ActionTypes.OpenUrl, Value = signInLink, Title = "Bot Service OAuth", }, }, }, }, }); } var client = new SimpleGraphClient(tokenResponse.Token); var profile = await client.GetMyProfile(); var imagelink = _siteUrl + await client.GetPublicURLForProfilePhoto(profile.Id); return(new MessagingExtensionActionResponse { Task = new TaskModuleContinueResponse { Value = new TaskModuleTaskInfo { Card = GetProfileCard(profile, imagelink), Height = 250, Width = 400, Title = "Adaptive Card: Inputs", }, }, }); } if (action.CommandId.ToUpper() == "SIGNOUTCOMMAND") { await(turnContext.Adapter as IUserTokenProvider).SignOutUserAsync(turnContext, _connectionName, turnContext.Activity.From.Id, cancellationToken); return(new MessagingExtensionActionResponse { Task = new TaskModuleContinueResponse { Value = new TaskModuleTaskInfo { Card = new Microsoft.Bot.Schema.Attachment { Content = new AdaptiveCard(new AdaptiveSchemaVersion("1.0")) { Body = new List <AdaptiveElement>() { new AdaptiveTextBlock() { Text = "You have been signed out." } }, Actions = new List <AdaptiveAction>() { new AdaptiveSubmitAction() { Title = "Close" } }, }, ContentType = AdaptiveCard.ContentType, }, Height = 200, Width = 400, Title = "Adaptive Card: Inputs", }, }, }); } return(null); }