Вопрос поставлен: Как получить токен аутентификации после входа пользователя в систему?
Справочная информация:
Я настраиваю аутентификацию для своего бота, используя Azure AD v1, с настройками подключения, показанными ниже.
Когда я тестирую соединение, я могу войти в систему, которая затем возвращает токен соединения и говорит: «Тестирование соединения с« BotAuth »выполнено успешно»
Аутентификация в боте: Когда я пытаюсь войти в бот, мне выдается карточка входа (показана ниже),
, которое вызывает диалоговое окно для входа в систему при нажатии входа. После входа в систему диалоговое окно закрывается, и больше ничего не происходит. Я включил мой код аутентификации ниже для справки. Из анализа моего кода я обнаружил, что метод «FinishLoginDialog» никогда не вызывается после входа в систему. Из того, что я прочитал, вы предполагаете получить маркер аутентификации после входа в систему (как тестовое соединение), но я никогда не получаю. Итак, возвращаясь к моему вопросу, как мне получить маркер аутентификации после входа пользователя в систему?
public class AuthenticationDialog : ComponentDialog
{
private static AuthenticationResponses _responder = new AuthenticationResponses();
public AuthenticationDialog()
: base(nameof(AuthenticationDialog))
{
InitialDialogId = nameof(AuthenticationDialog);
ConnectionName = "BotAuth";
var authenticate = new WaterfallStep[]
{
PromptToLogin,
FinishLoginDialog,
};
AddDialog(new WaterfallDialog(InitialDialogId, authenticate));
AddDialog(new OAuthPrompt(DialogIds.LoginPrompt, new OAuthPromptSettings()
{
ConnectionName = ConnectionName,
Title = AuthenticationStrings.TITLE,
Text = AuthenticationStrings.PROMPT,
}));
}
private string ConnectionName { get; set; }
private async Task<DialogTurnResult> PromptToLogin(WaterfallStepContext sc, CancellationToken cancellationToken)
{
return await sc.PromptAsync(AuthenticationResponses.ResponseIds.LoginPrompt, new PromptOptions());
}
private async Task<DialogTurnResult> FinishLoginDialog(WaterfallStepContext sc, CancellationToken cancellationToken)
{
var activity = sc.Context.Activity;
if (sc.Result != null)
{
var tokenResponse = sc.Result as TokenResponse;
if (tokenResponse?.Token != null)
{
var user = await GetProfile(sc.Context, tokenResponse);
await _responder.ReplyWith(sc.Context, AuthenticationResponses.ResponseIds.SucceededMessage, new { name = user.DisplayName });
return await sc.EndDialogAsync(tokenResponse);
}
}
else
{
await _responder.ReplyWith(sc.Context, AuthenticationResponses.ResponseIds.FailedMessage);
}
return await sc.EndDialogAsync();
}
private async Task<User> GetProfile(ITurnContext context, TokenResponse tokenResponse)
{
var token = tokenResponse;
var client = new GraphClient(token.Token);
return await client.GetMe();
}
private class DialogIds
{
public const string LoginPrompt = "loginPrompt";
}
}