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

.net AuthBot/BotAuth:如何在没有幻数的情况下设置身份验证,.net,authentication,botframework,.net,Authentication,Botframework,我正在尝试创建一个用户必须首先进行身份验证的bot。我很清楚不使用幻数验证的缺点,但是我希望用户在单击链接时直接进行身份验证。 我使用的机器人就是这个 这是用户输入时验证幻数的方法: public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument) { var msg = await argu

我正在尝试创建一个用户必须首先进行身份验证的bot。我很清楚不使用幻数验证的缺点,但是我希望用户在单击链接时直接进行身份验证。 我使用的机器人就是这个

这是用户输入时验证幻数的方法:

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);
            }
        }
公共虚拟异步任务消息ReceivedAsync(IDialogContext上下文,IAwaitable参数)
{
var msg=等待参数;
AuthResult AuthResult;
字符串“”已验证;
int magicNumber=0;
if(context.UserData.TryGetValue(ContextConstants.AuthResultKey,out authResult))
{
尝试
{
//重要提示:不要删除我们在这里执行的幻数检查。这是绝对安全要求
//删除此项将删除BOT和用户的安全漏洞。
//确保您了解攻击向量以及为什么要这样做。
context.UserData.TryGetValue(ContextConstants.MagicNumberValidated,out-validated);
如果(已验证=“真”)
{
context.Done($“谢谢{authResult.UserName}。您现在已登录。”);
}
else if(context.UserData.TryGetValue(ContextConstants.MagicNumberKey,out magicNumber))
{
如果(msg.Text==null)
{
等待上下文。PostAsync($“请粘贴回您在身份验证屏幕中收到的号码。”);
context.Wait(this.MessageReceivedAsync);
}
其他的
{
如果(msg.Text.Length>=6&&magicNumber.ToString()==msg.Text.Substring(0,6))
{
context.UserData.SetValue(ContextConstants.MagicNumberValidated,“true”);
context.Done($“谢谢{authResult.UserName}。您现在已登录。”);
}
其他的
{
context.UserData.RemoveValue(ContextConstants.AuthResultKey);
context.UserData.SetValue(ContextConstants.MagicNumberValidated,“false”);
context.UserData.RemoveValue(ContextConstants.MagicNumberKey);
wait context.PostAsync($“很抱歉,我无法验证您的号码。请再次尝试验证。”);
context.Wait(this.MessageReceivedAsync);
}
}
}
}
抓住
{
context.UserData.RemoveValue(ContextConstants.AuthResultKey);
context.UserData.SetValue(ContextConstants.MagicNumberValidated,“false”);
context.UserData.RemoveValue(ContextConstants.MagicNumberKey);
context.Done($“很抱歉,身份验证时出错。”);
}
}
其他的
{
等待此消息。CheckForLogin(上下文,msg);
}
}
有人告诉我如何在身份验证过程中不使用幻数吗?

使用和不使用,因为Authbot项目已经停止,并且没有更新到最新的bot框架更改。

现在不使用
幻数将导致严重的安全漏洞。引用自:

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

现在,如果您仍然想关闭它,尽管这是不可取的,但您必须在中将
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);
使用和不使用,因为Authbot项目已停止,并且未更新到最新的bot框架更改。

现在不使用
幻数将导致严重的安全漏洞。引用自:

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

现在,如果您仍然想关闭它,尽管这是不可取的,,但您必须在中设置
UseMagicNum