Событие входа элемента управления входа не запускается - PullRequest
1 голос
/ 04 марта 2011

Я заметил, что форумы изобилуют примерами этой проблемы, но единственными решениями, касающимися событий, которые на самом деле не подключены, или опечаток.Я почти уверен, что моя проблема не относится ни к одному из них!

У меня есть элемент управления для входа с открывающим тегом, который выглядит следующим образом:

<asp:Login ID="signInControl" FailureText="Sorry, your login has not been successful" runat="server" DisplayRememberMe="false" OnLoggedIn="signInControl_LoggedIn" OnAuthenticate="signInControl_Authenticate" OnLoggingIn="signInControl_LoggingIn">

Вот мои события в коде-behind:

protected void signInControl_LoggedIn(object sender, EventArgs e)
        {
            MembershipProvider provider = Membership.Providers[GlobalConstants.MembershipProviderName];
            MembershipUser user = provider.GetUser(this.signInControl.UserName, true);

            int expiryInDays = Utility.GetConfigurationValueAsInt(SPContext.Current.Web, "PasswordExpiryLengthInDays");

            // provide a mechanism to stop password expiry (i.e. if -1);
            if (expiryInDays > 0)
            {
                expiryInDays = expiryInDays * -1;

                // If the user hasn't changed their password within the last x days, send them to update it.
                DateTime minimumPasswordChange = DateTime.Now.AddDays(expiryInDays);

                TimeSpan due = user.LastPasswordChangedDate.Subtract(minimumPasswordChange);

                Logging.LogTrace(string.Format("The user {0} next password change is in {1} days.", user.UserName, due.Days));

                if (user.LastPasswordChangedDate >= minimumPasswordChange)
                {
                    SPUtility.Redirect("/_layouts/ExpiredPassword.aspx", SPRedirectFlags.Trusted, this.Context);
                }
            }
            else
            {
                SPUtility.Redirect("/_layouts/ExpiredPassword.aspx", SPRedirectFlags.Trusted, this.Context);
            }
        }
protected void signInControl_Authenticate(object sender, AuthenticateEventArgs e)
        {
            SPClaimsUtility.AuthenticateFormsUser(new Uri(SPContext.Current.Web.Url), this.signInControl.UserName, this.signInControl.Password);
            e.Authenticated = Membership.ValidateUser(this.signInControl.UserName, this.signInControl.Password);
        }
protected void signInControl_LoggingIn(object sender, LoginCancelEventArgs e)
        {
            Logging.LogTrace(string.Format("User {0} attempting to sign in.", this.signInControl.UserName));
            e.Cancel = false;
        }

И как вы можете видеть в событии authenticate, e.authenticated устанавливается тем, может ли пользователь быть проверен.Введя код, я подтвердил, что возвращается true.Так почему же мой метод signInControl_LoggedIn не сработал?Я серьезно запутался!

Это разметка для интерфейса:

Спасибо за любую помощь!

Карл.

Ответы [ 2 ]

1 голос
/ 03 августа 2011

Существует несколько публикаций, в которых описывается, как создать собственную страницу входа в систему для SharePoint 2010. Здесь - это то, за кем я следовал. Обычно они создают страницу приложения, которая наследуется от FormsSignInPage. Для страницы, которой просто нужно изменить внешний вид, это работает хорошо. В некоторых случаях, таких как этот, создание страницы входа в систему таким способом может быть недостаточным.

Как описано в конце этой записи , вам нужно наследовать от IdentityModelSignInPageBase вместо FormsSignInPage. Вам также необходимо создать обработчик событий для события authenticate и зарегистрировать его в событии OnLoad на странице.

Это связано с тем, что метод Authenticate в элементе управления автоматически переводит пользователя на страницу ReturnUrl до того, как он вызовет событие OnLoggedIn. Для аутентификации пользователя в этом методе требуется всего две строки кода.

void signInControl_Authenticate(object sender, AuthenticateEventArgs e)
{
  Login signInControl = sender as Login;
  e.Authenticated = SPClaimsUtility.AuthenticateFormsUser(this.Page.Request.Url, signInControl.UserName, signInControl.Password);
}

Поскольку ваш код теперь не отправляет пользователя на значение ReturnUrl, событие OnLoggedIn достигнуто.

Вы можете спросить, зачем мне событие OnLoggedIn, если мне нужно создать собственный метод Authenticate. Что ж, есть еще функции, которые управление будет обрабатывать для вас. Например, если пользователь не выполняет аутентификацию (т.е. неправильная комбинация UN и PW), элемент управления отобразит сообщение об ошибке, и OnLoggedIn никогда не сработает.

0 голосов
/ 10 ноября 2015

Если вы наследуете от FormsSignInPage, вы можете переопределить свою функцию RedirectToSuccessUrl:

protected override void RedirectToSuccessUrl()
{
    //Your code here if successful login
    base.RedirectToSuccessUrl();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...