我注意到论坛上充斥着这个问题的例子,但是唯一的解决方案是指事件实际上没有被连接,或者是错别字。我很确定我的问题与这些都没有关系!
我有一个带有开头标记的登录控件,如下所示:
<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;
}
正如您在authenticate事件中看到的那样,e.authenticated是根据用户是否可以进行验证来设置的。我已经通过踩入代码确认返回了true。那么为什么我的signInControl_LoggedIn方法不会被触发?我很困惑!
这是前端的标记:
感谢您的帮助!
卡尔。
答案 0 :(得分:1)
有很多帖子介绍了如何为SharePoint 2010创建自己的自定义登录页面。Here是我所遵循的。通常,它们会创建一个继承自FormsSignInPage的应用程序页面。对于只需要更改外观和感觉的页面,这很有效。在某些情况下,像这样,以这种方式创建登录页面可能还不够。
在post末尾描述的方式,您需要从IdentityModelSignInPageBase而不是FormsSignInPage继承。您还需要为authenticate事件创建事件处理程序,并在页面的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永远不会触发。
答案 1 :(得分:0)
如果您继承自FormsSignInPage
,则可以覆盖您的函数RedirectToSuccessUrl
:
protected override void RedirectToSuccessUrl()
{
//Your code here if successful login
base.RedirectToSuccessUrl();
}