Какое путешествие. Как я уже говорил, это было разработано в asp.net. Страница Login.aspx использует большинство оригинальных элементов шаблона, включая оригинальный asp: элемент управления Login:
<asp:Login ID="LoginUser" runat="server" ViewStateMode="Disabled" RenderOuterTable="false">
<LayoutTemplate>
<p class="validation-summary-errors" runat="server">
<asp:Literal runat="server" ID="FailureText" />
<asp:Label ID="accessDenied" Font-Size="Large" ForeColor="red" CssClass="accessDeniedLabel" Visible="false" runat="server" >
Only JCPS employees that are teachers, administrators, counselors, or support staff may enter the <strong>"Staff Only"</strong>
sections of the DMC.
</asp:Label>
</p>
<fieldset>
<legend>Log in Form</legend>
<ol>
<li>
<asp:Label ID="Label1" runat="server" AssociatedControlID="UserName">User name:</asp:Label>
<asp:TextBox runat="server" ID="username" />
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="UserName" CssClass="field-validation-error" ErrorMessage="The user name field is required." />
</li>
<li>
<asp:Label ID="Label2" runat="server" AssociatedControlID="Password">Password</asp:Label>
<asp:TextBox runat="server" ID="Password" TextMode="Password" />
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="Password" CssClass="field-validation-error" ErrorMessage="The password field is required." />
</li>
<li>
<asp:CheckBox runat="server" ID="RememberMe" />
<asp:Label runat="server" ID="cbRememberMe" AssociatedControlID="RememberMe" CssClass="checkbox">Remember me on this device?</asp:Label>
</li>
</ol>
<asp:Button ID="Button1" runat="server" CommandName="Login" Text="Log in" OnCommand="Login_Click" />
</fieldset>
</LayoutTemplate>
</asp:Login>
После того, как пользователь вводит свои учетные данные и нажимает кнопку «Вход», он отправляется методу входа. Если пользователь входит в систему со своим идентификатором пользователя, я проверяю в активном каталоге, устанавливаю cookie и перенаправляю. Это работает отлично. Если пользователь входит в систему со своим адресом электронной почты, в исходной функции, которую я разместил выше, я выполняю поиск его идентификатора пользователя, а затем продолжаю путь, чтобы убедиться, что он находится в активном каталоге. Это было причиной перенаправления, чтобы не работать.
Я изменил процедуру, добавив в нее дополнительную строку кода - после получения идентификатора пользователя я изменяю значение в поле LoginUser.UserName, чтобы оно также было идентификатором пользователя - до того, как я просто разрешил отправку электронной почты Адрес поездки, потому что если вы посмотрите на процедуру, я не буду использовать ее где-либо еще и не думаю, что это имеет значение. По-видимому, изменение поля LoginUser.UserName в соответствии с идентификатором пользователя позволило перенаправлению начать работать. Таким образом, очевидно, что есть какая-то закулисная магия, когда asp.net сопоставляет идентификатор, передаваемый в тикет FormAuthentication, с текстом, который фактически находится в элементе управления asp.net:Login, и если они не совпадают, я думаю, просто перенаправить его обратно на страницу входа.
Надеюсь, это поможет другим, кто пытается получить логин, принять либо идентификатор пользователя, либо адрес электронной почты ...
protected void Login_Click(object sender, CommandEventArgs e)
{
myUtils mu = new myUtils();
string userID = LoginUser.UserName;
string userPW = LoginUser.Password;
bool remMe = (LoginUser.FindControl("RememberMe") as CheckBox).Checked;
MembershipProvider dp;
//Search for @ in the value typed into the User ID box to see if they are logging
//in using their e-mail address or User ID, and if they are using their email
//address get their ID and continue processing with it
if (userID.IndexOf("@") > 0)
{
userID = mu.getUserIDByEmailAddress(userID);
LoginUser.UserName = userID;
}
dp = Membership.Providers["MyADMembershipProvider_AccountName"];
//Verify the user is in Active Directory, it's a test account, or that Jimmy is debugging...
if (
(dp.ValidateUser(userID, userPW)) //User is in active directory
|| (mu.isTestAccount(userID, userPW) //User is logging in with a test account
|| (HttpContext.Current.Request.IsLocal)) //Debugging, doesn't really matter...
) {
mu.getUserData(userID);
FormsAuthentication.RedirectFromLoginPage(userID, remMe);
}
else
{
((Label)LoginUser.FindControl("accessDenied")).Visible = true;
Response.Write("Invalid UserID and Password");
}
}