1

我注意到论坛上充斥着这个问题的例子,但唯一的解决方案是指事件实际上并没有被连接起来,或者是拼写错误。我很确定我的问题与这些都不相关!

我有一个带有打开标签的登录控件,如下所示:

<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">

这是我在代码隐藏中的事件:

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;
        }

正如您在 authentication 事件中看到的那样, e.authenticated 是由是否可以验证用户来设置的。我通过进入返回 true 的代码确认。那么为什么我的 signInControl_LoggedIn 方法没有触发呢?我严重困惑!

这是前端的标记:

谢谢你的帮助!

卡尔。

4

2 回答 2

1

有许多帖子描述了如何为 SharePoint 2010 创建您自己的自定义登录页面。 是我关注的一个。通常,他们创建一个从 FormsSignInPage 继承的应用程序页面。对于只需要更改外观的页面,这很有效。在某些情况下,像这种情况,以这种方式创建登录页面可能还不够。

在本文末尾描述的方式您需要从 IdentityModelSignInPageBase 继承而不是 FormsSignInPage。您还需要为身份验证事件创建一个事件处理程序,并将其注册到页面的 OnLoad 事件中。

这是因为控件中的 Authenticate 方法会在调用 OnLoggedIn 事件之前自动将用户带到“ReturnUrl”页面。这种方法只需要两行代码就可以对用户进行身份验证。

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 事件。

如果我必须创建自定义 Authenticate 方法,您可能会问为什么我需要 OnLoggedIn 事件。好吧,控件仍然会为您处理一些功能。例如,如果用户没有进行身份验证(即错误的 UN 和 PW 组合),控件将显示错误消息并且 OnLoggedIn 永远不会触发。

于 2011-08-03T17:21:04.290 回答
0

如果你继承FormsSignInPage你可能会覆盖你的功能RedirectToSuccessUrl

protected override void RedirectToSuccessUrl()
{
    //Your code here if successful login
    base.RedirectToSuccessUrl();
}
于 2015-11-10T11:52:46.440 回答