Мне удалось придумать способ сделать это, но, вероятно, это не идеальный сценарий. Я хотел запустить диалог из API, в частности диалог аутентификации, который получает токен OAuth пользователя для доступа к графику. Если пользователь вошел в систему, токен возвращается немедленно, а если нет, он получает приглашение для входа. У меня есть что-то вроде этого в моем коде бота (отредактировано для краткости):
public static async Task<string> GetTokenAsync(ITurnContext turnContext, CancellationToken cancellationToken)
{
var dialogState = _accessors.ConversationState.CreateProperty<DialogState>(nameof(DialogState));
var dialogSet = new DialogSet(dialogState);
dialogSet.Add(new AuthDialog());
DialogContext dc = await dialogSet.CreateContextAsync(turnContext, cancellationToken);
var turnResult = await dc.BeginDialogAsync("AuthDialog");
await _accessors.ConversationState.SaveChangesAsync(turnContext, false, cancellationToken);
if(turnResult.Status== DialogTurnStatus.Waiting)
{
_log.Debug("Got login request for user-waiting for response");
return string.Empty;
}
else if(turnResult.Result is TokenResponse)
{
return ((TokenResponse)turnResult.Result).Token;
}
return null;
}
Это создает диалог и, если возможно, возвращает токен. В моем webAPI у меня есть что-то вроде этого, чтобы активировать его:
string conversationID = "CONV_ID_FROM_STATE";
var members = await m_client.Conversations.GetConversationMembersAsync(conversationID);
BotFrameworkAdapter b = new BotFrameworkAdapter(new SimpleCredentialProvider("BOT ID", "BOT_SECRET"));
var message = Activity.CreateMessageActivity();
message.Text = "login";
message.From = new ChannelAccount(members[0].Id);
message.Conversation = new ConversationAccount(id: conversationID, conversationType: "personal", tenantId: :BOT_TENANT_ID);
message.ChannelId = "msteams";
TurnContext t = new TurnContext(b, (Activity)message);
ClaimsIdentity id = new ClaimsIdentity();
id.AddClaim(new Claim("aud", "BOT_ID"));
t.TurnState.Add("BotIdentity", id);
t.TurnState.Add("Microsoft.Bot.Builder.BotAdapter.OAuthScope", "https://api.botframework.com");
t.TurnState.Add("Microsoft.Bot.Connector.IConnectorClient", m_client);
string token = await myBot<AuthDialog>.GetTokenAsync(t, default);
На этом этапе, если токен является пустой строкой, пользователь не вошел в систему, но в противном случае он должен быть действительным токен для выполнения вызовов графика. Я протестировал это с несколькими новыми учетными записями, и, похоже, это работает, поэтому я называю это победой на данный момент. Если что-то здесь принципиально не работает, прокомментируйте.