我正在尝试创建一个用户必须首先进行身份验证的机器人。我很清楚不使用幻数验证时的缺点,但我希望用户在点击链接时直接进行身份验证。 我正在使用的机器人是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);
}
}
有人告诉我如何在认证过程中不使用幻数?
答案 0 :(得分:3)
Bot Framework最近启用了Authentication using Sign-in Cards。您不再需要使用BotAuth或AuthBot。此新功能包括不使用幻数流的功能。如果您愿意,您仍然可以选择使用它。
在GitHubBot sample中,您可以找到使用第三方OAuth提供商的示例。
在BasicOAuth sample中。有一个使用您自己的OAuth提供程序的示例。
有2个AAD样本答案 1 :(得分:1)
使用Botauth而非Authbot因为Authbot项目已停止使用,并且未更新为最新的bot框架更改。
现在不使用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);