Вход в FormsAuthentication с адресом электронной почты вызывает перенаправление, чтобы не работать - PullRequest
0 голосов
/ 09 января 2019

У меня есть приложение asp.net/c#, которое использует MembershipProvider и FormsAuthentication для проверки того, что пользователь находится в Active Directory, создает cookie и перенаправляет обратно на страницу, с которой он пришел.

Если пользователь входит в систему со своим userID (активным каталогом cn), я передаю его через Membership.ValidateUser и в случае успеха использую FormsAuthentication.GetRedirectURL, чтобы создать cookie и перенаправить его обратно на свою исходную страницу. Это прекрасно работает и полностью, как и ожидалось.

Если, однако, пользователь входит в систему со своим адресом электронной почты, я заменяю его адрес электронной почты на его идентификатор пользователя, выполняя поиск в моей базе данных. В этот момент используется точно такой же код, как описано выше, но по какой-то причине перенаправление завершается неудачно, и мой сайт остается на странице входа в систему.

Как видно из приведенного ниже кода, я даже пытался поменять местами FormsAuthentication.GetRedirectURL с SetAuthCookie и Response.Redirect, и он работает точно так же, как описано выше.

Я подумал, что, возможно, длина адреса электронной почты приводила к тому, что размер файла cookie был слишком большим, но он меньше 500, а не близко к пределу 4096.

Кто-нибудь видел что-нибудь подобное раньше? Есть предложения?

protected void Login_Click(object sender, CommandEventArgs e)
{
    myUtils mu = new myUtils();

    string userID = (LoginUser.FindControl("UserName") as TextBox).Text;
    string userPW = (LoginUser.FindControl("Password") as TextBox).Text;
    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);

    dp = Membership.Providers["MyADMembershipProvider_AccountName"];

    //Verify if the user is in Active Directory or that Jimmy is debugging...
    //if ((dp.ValidateUser(userID, userPW)) || (HttpContext.Current.Request.IsLocal))
    if (
        (dp.ValidateUser(userID, userPW))       //User is in active directory
        || (mu.isTestAccount(userID, userPW))   //User is logging in with a test account
        ) {
        mu.getUserData(userID);
        FormsAuthentication.SetAuthCookie(userID, remMe);
        string url = FormsAuthentication.GetRedirectUrl(userID, false);
        Response.Redirect(url, false);
        //FormsAuthentication.RedirectFromLoginPage(userID, remMe);
    }
    else
    {
        ((Label)LoginUser.FindControl("accessDenied")).Visible = true;
        Response.Write("Invalid UserID and Password");
    }
}

1 Ответ

0 голосов
/ 09 января 2019

Какое путешествие. Как я уже говорил, это было разработано в 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>
            &nbsp;
        </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");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...