Я хочу добавить «анти-робот» вопрос в CreateUserWizard как более доступную альтернативу элементу управления Captcha. Я довольно новичок в asp и обнаружил, что немного застрял в мышлении WinForms. Однако я придумала что-то, что, кажется, работает.
Markup:
<asp:CreateUserWizard ID="CreateUserWizard1" runat="server">
.
.
<tr>
<td align="right">
<asp:Label ID="AntiRobotQuestion" runat="server" AssociatedControlID="AntiRobotAnswer">
Question:
</asp:Label>
</td>
<td>
<asp:TextBox ID="AntiRobotAnswer" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="AntiRobotAnswerRequired" runat="server" ControlToValidate="AntiRobotAnswer" ErrorMessage="Answer is required." ToolTip="Answer is required." ValidationGroup="CreateUserWizard1">
</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td align="center" colspan="2" style="color:Red;">
<asp:Literal ID="CustomErrorMessage" runat="server" Visible="False" EnableViewState="False"></asp:Literal>
</td>
</tr>
.
.
</asp:CreateUserWizard>
Код:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) {
//Set up the Anti-Robot Question and Answer
Label robotQuestion = (Label)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("AntiRobotQuestion");
//Simulate randomly selecting a question and answer from a database table...
robotQuestion.Text = "What is the capital of France";
Session["AntiRobotAnswer"] = "Paris";
}
}
protected void CreateUserWizard1_CreatingUser(object sender, LoginCancelEventArgs e)
{
//Check the anti-robot Q & A
TextBox robotAnswer = (TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("AntiRobotAnswer");
if (robotAnswer.Text != (string)Session["AntiRobotAnswer"])
{
Literal errorMessage = (Literal)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("CustomErrorMessage");
errorMessage.Text = "Wrong answer! Are you a robot?";
errorMessage.Visible = true;
e.Cancel = true;
}
}
Это приемлемый способ закодировать это? Две вещи кажутся мне немного «неопрятными»:
- Использование FindControl для извлечения ссылок на элементы управления в разметке.
- Сохранение ожидаемого ответа в переменной сеанса. (Насколько это безопасно?)
РЕДАКТИРОВАТЬ (2012-01-23)
Некоторые действительные варианты дизайна были предоставлены. Однако у меня есть веская причина использовать этот метод вопросов и ответов (возможно, в дополнение к идее приманки). Например, вопрос, относящийся к теме форума, может помочь предотвратить спамеров, а также ботов. Вопрос в том, является ли приведенный выше код приемлемым способом сделать это? Исходя из фона WinForms, мне это кажется немного неуклюжим, но, возможно, именно так должен выглядеть asp.