AuthBot / BotAuth: как установить аутентификацию без магического номера - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь создать бота, в котором пользователь должен сначала пройти аутентификацию.Мне хорошо известны недостатки, когда не используется проверка магических чисел, однако я хочу, чтобы пользователь проходил аутентификацию непосредственно при нажатии на ссылку.Бот, который я использую, это AuthBot .

. Этот метод проверяет магическое число при вводе пользователем:

public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)
        {
            var msg = await argument;

            AuthResult authResult;
            string validated = "";
            int magicNumber = 0;
            if (context.UserData.TryGetValue(ContextConstants.AuthResultKey, out authResult))
            {
                try
                {
                    //IMPORTANT: DO NOT REMOVE THE MAGIC NUMBER CHECK THAT WE DO HERE. THIS IS AN ABSOLUTE SECURITY REQUIREMENT
                    //REMOVING THIS WILL REMOVE YOUR BOT AND YOUR USERS TO SECURITY VULNERABILITIES. 
                    //MAKE SURE YOU UNDERSTAND THE ATTACK VECTORS AND WHY THIS IS IN PLACE.
                    context.UserData.TryGetValue<string>(ContextConstants.MagicNumberValidated, out validated);
                    if (validated == "true")
                    {
                        context.Done($"Thanks {authResult.UserName}. You are now logged in. ");
                    }
                    else if (context.UserData.TryGetValue<int>(ContextConstants.MagicNumberKey, out magicNumber))
                    {
                        if (msg.Text == null)
                        {
                            await context.PostAsync($"Please paste back the number you received in your authentication screen.");

                            context.Wait(this.MessageReceivedAsync);
                        }
                        else
                        {

                            if (msg.Text.Length >= 6 && magicNumber.ToString() == msg.Text.Substring(0, 6))
                            {
                                context.UserData.SetValue<string>(ContextConstants.MagicNumberValidated, "true");
                                context.Done($"Thanks {authResult.UserName}. You are now logged in. ");
                            }
                            else
                            {
                                context.UserData.RemoveValue(ContextConstants.AuthResultKey);
                                context.UserData.SetValue<string>(ContextConstants.MagicNumberValidated, "false");
                                context.UserData.RemoveValue(ContextConstants.MagicNumberKey);
                                await context.PostAsync($"I'm sorry but I couldn't validate your number. Please try authenticating once again. ");

                                context.Wait(this.MessageReceivedAsync);
                            }
                        }
                    }
                }
                catch
                {
                    context.UserData.RemoveValue(ContextConstants.AuthResultKey);
                    context.UserData.SetValue(ContextConstants.MagicNumberValidated, "false");
                    context.UserData.RemoveValue(ContextConstants.MagicNumberKey);
                    context.Done($"I'm sorry but something went wrong while authenticating.");
                }
            }
            else
            {
                await this.CheckForLogin(context, msg);
            }
        }

Кто-то показывает мне, какне использовать магический номер в процессе аутентификации?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Bot Framework недавно включил Аутентификация с использованием карт входа .Вам больше не нужно использовать BotAuth или AuthBot.В эту новую функцию включена возможность не использовать поток магических чисел.У вас все еще есть возможность использовать его, если хотите.

В примере GitHubBot вы можете найти пример использования стороннего поставщика OAuth.

В примере BasicOAuth .Есть пример использования вашего собственного поставщика OAuth.

Затем есть 2 образца AAD для AADV1 и AADV2

0 голосов
/ 24 мая 2018

Используйте Botauth , а не Authbot , так как проект Authbot был прекращен и не обновлен до последних изменений в структуре бота.Authbot discontinued

Теперь не использование magic number приведет к серьезной уязвимости безопасности.Как указано в docs :

Свойство UseMagicNumber было добавлено в класс AuthenticationOptions, чтобы разрешить отключение магического числа.Однако введение этого свойства, вероятно, было ошибкой, поскольку оно представляет собой серьезную уязвимость безопасности и с тех пор было помечено как устаревшее.Чтобы объяснить уязвимость безопасности, вам нужно понять, как работает поток аутентификации.Когда определено, что у пользователя бота нет действительного токена, BotAuth генерирует URL для пользователя, чтобы инициировать поток аутентификации.Этот URL-адрес включает в себя все параметры диалога, зашифрованные в параметре состояния, поэтому контроллер обратного вызова может продолжить диалог после получения токена. Без магического номера пользователь может отправить кому-то еще этот URL и (при нажатии) получить доступ к своему токену .

Теперь, если вы все еще хотите отключить его, еще раз, хотя это не рекомендуется , то, что вам нужно сделать в Authbot устанавливает для свойства UseMagicNumber значение false.

Код будет выглядеть примерно так:

// Initialize AuthenticationOptions and forward to AuthDialog for token
AuthenticationOptions options = new AuthenticationOptions()
{
    Authority = ConfigurationManager.AppSettings["ActiveDirectory.Authority"],
    ClientId = ConfigurationManager.AppSettings["ActiveDirectory.ClientId"],
    ClientSecret = ConfigurationManager.AppSettings["ActiveDirectory.ClientSecret"],
    ResourceId = ConfigurationManager.AppSettings["ActiveDirectory.ResourceId"],
    RedirectUrl = ConfigurationManager.AppSettings["ActiveDirectory.RedirectUrl"],
    UseMagicNumber = false
};

await context.Forward(new AuthDialog(new ADALAuthProvider(), options), this.ResumeAfterAuth, message, CancellationToken.None);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...