每当用户通过输入错误的密码多次锁定Sitecore时,我都需要让Sitecore向特定的电子邮件地址发送电子邮件。我有代码发送电子邮件;但是,我没有看到在登录过程中触发的管道(登录和登录仅在成功登录时触发)。
答案 0 :(得分:3)
由于域没有以LoggingIn事件中的UserName属性为前缀,因此必须稍微修改@ Maras的答案才能使其工作。除此之外,代码效果很好。
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中完成测试。
答案 1 :(得分:1)
此解决方案假设您使用的是标准 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 文件并在继承属性中设置新类:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs"
Inherits="My.Assembly.Namespace.MyLoginPage" %>
这不是最优雅的解决方案,但正如您和@OptimizedQuery注意到的那样,LoggingIn
和LoggedIn
管道在这种情况下是不够的。
答案 2 :(得分:0)
我在Sitecore.Pipelines.LoggingIn.CheckStartPage, Sitecore.Kernel
管道流程中的loggingin
处理器之前添加了一个自定义管道流程。当我输入有效的用户名和无效密码时,在收到通知我的登录失败之前,我的断点被点击了。如果您的自定义处理器位于CheckStartPage
处理器之后,那么只有在成功登录时才会遇到它,因为如果用户名/密码组合验证失败,CheckStartPage
进程将中止管道。我不确定如何检查锁定的用户,但看起来您应该能够在CheckStartPage
处理器之前添加处理器或覆盖该处理器。
我的测试和反射是在Sitecore 6.6解决方案上完成的。