在Sitecore中锁定用户后向管理员发送电子邮件
我需要让Sitecore在用户因多次输入错误密码而被锁定在Sitecore之外时向特定的电子邮件地址发送电子邮件。我有代码发送电子邮件;但是,我没有看到在登录过程中触发的管道(loggedin和loggingin仅在成功登录时触发) 我在在Sitecore中锁定用户后向管理员发送电子邮件,sitecore,Sitecore,我需要让Sitecore在用户因多次输入错误密码而被锁定在Sitecore之外时向特定的电子邮件地址发送电子邮件。我有代码发送电子邮件;但是,我没有看到在登录过程中触发的管道(loggedin和loggingin仅在成功登录时触发) 我在LoggingIn管道进程中的Sitecore.Pipelines.loggin.CheckStartPage,Sitecore.Kernel处理器之前添加了一个自定义管道进程。当我输入一个有效的用户名和无效的密码时,我的断点被击中,然后我被通知登录失败。如果您
LoggingIn
管道进程中的Sitecore.Pipelines.loggin.CheckStartPage,Sitecore.Kernel
处理器之前添加了一个自定义管道进程。当我输入一个有效的用户名和无效的密码时,我的断点被击中,然后我被通知登录失败。如果您的自定义处理器位于CheckStartPage
处理器之后,则只有在成功登录时才会被命中,因为如果用户名/密码组合未通过验证,CheckStartPage
进程会中止管道。我不确定如何检查被锁定的用户,但似乎您应该能够在检查开始页面
处理器之前添加处理器或覆盖该处理器
我的测试和反思是在Sitecore 6.6解决方案上完成的。我在
LoggingIn
管道过程中的Sitecore.Pipelines.LoggingIn.CheckStartPage、Sitecore.Kernel
处理器之前添加了一个自定义管道过程。当我输入一个有效的用户名和无效的密码时,我的断点被击中,然后我被通知登录失败。如果您的自定义处理器位于CheckStartPage
处理器之后,则只有在成功登录时才会被命中,因为如果用户名/密码组合未通过验证,CheckStartPage
进程会中止管道。我不确定如何检查被锁定的用户,但似乎您应该能够在检查开始页面
处理器之前添加处理器或覆盖该处理器
我的测试和反思是在Sitecore 6.6解决方案上完成的。此解决方案假设您使用的是标准的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
管道在这种情况下是不够的。此解决方案假定您使用的是标准的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
管道在这种情况下是不够的。必须稍微修改@Maras的答案,以使其正常工作,因为域在Logginging事件中没有前缀为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中完成。必须稍微修改@Maras的答案才能使其正常工作,因为在Logginging事件中,域没有前缀为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域中查找锁定用户还是来自外部成员资格提供商的用户?@WesleyLomax:Sitecore域。@EdSchwehm您看到我下面的答案了吗?它对你有用吗?@Maras:我还没有机会测试它。我问这个问题是做实际开发的前奏。但是,请放心,我将测试您和OptimizedQuery的解决方案。您是在寻找Sitecore域中被锁定的用户还是来自外部成员资格提供商的用户?@WesleyLomax:Sitecore域。@EdSchwehm您看到我下面的答案了吗?它对你有用吗?@Maras:我还没有机会测试它。我问这个问题是做实际开发的前奏。但是,请放心,我将测试您和OptimizedQuery的解决方案。