2011-03-04 90 views
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; 
     } 

而且你可以在认证见事件,e.authenticated由用户是否可以验证来设置。我已经通过加入返回true的代码进行了确认。那么,为什么我的signInControl_LoggedIn方法不会触发?我很困惑!

这是前端的标记:

感谢您的任何帮助!

卡尔。

+0

无法看到您打开标签。 – 2011-03-04 17:20:34

+0

你也可以在你的aspx页面上发布你的登录控制代码吗? – 2011-03-04 17:24:54

+0

尝试使用调试器逐步执行代码。 – rook 2011-03-04 17:36:46

回答

1

有许多职位描述了如何为SharePoint 2010创建自己的自定义登录页面。Here是我遵循的职位。通常,他们创建一个从FormsSignInPage继承的应用程序页面。对于只需要改变外观和感觉的页面,这很有效。在某些情况下,像这样,以这种方式创建登录页面可能不够。

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

这是因为在调用OnLoggedIn事件之前,控件中的Authenticate方法会自动将用户带到“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事件。

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

+0

非常感谢您对我的关注Rich! – Karl 2012-09-20 09:36:21

0

如果从FormsSignInPage继承你可以重写你的函数RedirectToSuccessUrl

protected override void RedirectToSuccessUrl() 
{ 
    //Your code here if successful login 
    base.RedirectToSuccessUrl(); 
}