AuthBot / BotAuth:如何在没有幻数的情况下设置身份验证

时间:2018-05-24 15:22:07

标签: .net authentication botframework

我正在尝试创建一个用户必须首先进行身份验证的机器人。我很清楚不使用幻数验证时的缺点,但我希望用户在点击链接时直接进行身份验证。 我正在使用的机器人是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 :(得分:3)

Bot Framework最近启用了Authentication using Sign-in Cards。您不再需要使用BotAuth或AuthBot。此新功能包括不使用幻数流的功能。如果您愿意,您仍然可以选择使用它。

GitHubBot sample中,您可以找到使用第三方OAuth提供商的示例。

BasicOAuth sample中。有一个使用您自己的OAuth提供程序的示例。

然后,AADV1AADV2

有2个AAD样本

答案 1 :(得分:1)

使用Botauth而非Authbot因为Authbot项目已停止使用,并且未更新为最新的bot框架更改。 Authbot discontinued

现在不使用magic number会导致严重的安全漏洞。引自docs

  

UseMagicNumber属性已添加到AuthenticationOptions类中,以允许关闭幻数。然而,这个属性的引入可能是一个错误,因为它是一个严重的安全漏洞,并且已经被标记为过时。要解释安全漏洞,您需要了解身份验证流程的工作原理。当确定机器人用户没有有效令牌时,BotAuth会为用户生成一个URL以启动身份验证流程。此URL包括在state参数中加密的所有会话参数,因此回调控制器可以在获取令牌后继续对话。 如果没有幻数,用户可以向其他人发送此网址,并且(如果点击)可以访问其令牌

现在,如果您仍想将其关闭,再次,但不建议,则您需要在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);
相关问题