在Sitecore中锁定用户后向管理员发送电子邮件

在Sitecore中锁定用户后向管理员发送电子邮件,sitecore,Sitecore,我需要让Sitecore在用户因多次输入错误密码而被锁定在Sitecore之外时向特定的电子邮件地址发送电子邮件。我有代码发送电子邮件;但是,我没有看到在登录过程中触发的管道(loggedin和loggingin仅在成功登录时触发) 我在LoggingIn管道进程中的Sitecore.Pipelines.loggin.CheckStartPage,Sitecore.Kernel处理器之前添加了一个自定义管道进程。当我输入一个有效的用户名和无效的密码时,我的断点被击中,然后我被通知登录失败。如果您

我需要让Sitecore在用户因多次输入错误密码而被锁定在Sitecore之外时向特定的电子邮件地址发送电子邮件。我有代码发送电子邮件;但是,我没有看到在登录过程中触发的管道(loggedin和loggingin仅在成功登录时触发)

我在
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的解决方案。