每当用户因输入错误密码太多次而被锁定在 Sitecore 之外时,我需要让 Sitecore 向特定电子邮件地址发送电子邮件。我有发送电子邮件的代码;但是,我没有看到在登录过程中触发的管道(登录和登录仅在成功登录时触发)。
3 回答
必须稍微修改@Maras 的答案才能使其正常工作,因为域没有作为 LoggingIn 事件中 UserName 属性的前缀。除此之外,代码效果很好。
namespace My.Namespace.Login
{
public class CustomLoginPage : LoginPage
{
private bool _userIsNotLockedOut;
protected override void OnInit(EventArgs e)
{
Login.LoggingIn += Login_LoggingIn;
Login.LoginError += Login_LoginError;
base.OnInit(e);
}
private void Login_LoggingIn(object sender, LoginCancelEventArgs e)
{
string domainUser = Login.UserName;
if (!domainUser.Contains("sitecore\\"))
{
var domain = Sitecore.Context.Domain;
domainUser = domain + @"\" + domainUser;
}
var user = Membership.GetUser(domainUser, false);
if (user != null)
{
_userIsNotLockedOut = !user.IsLockedOut;
}
}
private void Login_LoginError(object sender, EventArgs e)
{
if (_userIsNotLockedOut)
{
var user = Membership.GetUser(Login.UserName, false);
if (user != null && user.IsLockedOut)
{
SendEmail();
}
}
}
}
}
您还需要参考 Sitecore.Client.dll,在 Sitecore 7 中完成测试。
此解决方案假定您使用的是标准Sitecore登录页面。
我设法通过覆盖Sitecore登录页面来实现您所需要的。您需要做的是创建一个继承自Sitecore.sitecore.login.LoginPage
(它不是拼写错误)类的类,然后添加2个方法,这些方法将在登录系统之前和登录失败后执行,如下所示:
namespace My.Assembly.Namespace
{
public class MyLoginPage : LoginPage
{
private bool maybeWillBeLockedOut;
protected override void OnInit(EventArgs e)
{
Login.LoggingIn += Login_LoggingIn;
Login.LoginError += Login_LoginError;
base.OnInit(e);
}
void Login_LoggingIn(object sender, LoginCancelEventArgs e)
{
MembershipUser user = Membership.Provider.GetUser(Login.UserName, false);
// user with username exists and is not locked out yet
maybeWillBeLockedOut = user != null && !user.IsLockedOut;
}
void Login_LoginError(object sender, EventArgs e)
{
if (maybeWillBeLockedOut)
{
// login failed - lets check if locked out now
MembershipUser user = Membership.Provider.GetUser(Login.UserName, false);
if (user != null && user.IsLockedOut)
{
// user wasn't locked out but is now - send an email
SendEmail();
}
}
}
}
}
然后更新sitecore\login\default.aspx文件并在Inherits属性中设置新类:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs"
Inherits="My.Assembly.Namespace.MyLoginPage" %>
这不是最优雅的解决方案,但正如您和 @OptimizedQuery 所注意到的那样,LoggingIn
在LoggedIn
这种情况下管道是不够的。
Sitecore.Pipelines.LoggingIn.CheckStartPage, Sitecore.Kernel
我在管道进程中的处理器之前添加了一个自定义管道loggingin
进程。当我输入一个有效的用户名和无效的密码时,我的断点在我被通知我的登录不成功之前被击中。如果您的自定义处理器在CheckStartPage
处理器之后,那么它只会在成功登录时受到打击,因为CheckStartPage
如果用户名/密码组合验证失败,该进程会中止管道。我不确定如何检查被锁定的用户,但看起来您应该能够在处理器之前添加CheckStartPage
处理器或覆盖该处理器。
我的测试和反思是在 Sitecore 6.6 解决方案上完成的。