0

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

4

3 回答 3

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 中完成测试。

于 2013-08-09T08:36:32.887 回答
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文件并在Inherits属性中设置新类:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs"
    Inherits="My.Assembly.Namespace.MyLoginPage" %>

这不是最优雅的解决方案,但正如您和 @OptimizedQuery 所注意到的那样,LoggingInLoggedIn这种情况下管道是不够的。

于 2013-03-13T22:40:20.503 回答
0

Sitecore.Pipelines.LoggingIn.CheckStartPage, Sitecore.Kernel我在管道进程中的处理器之前添加了一个自定义管道loggingin进程。当我输入一个有效的用户名和无效的密码时,我的断点在我被通知我的登录不成功之前被击中。如果您的自定义处理器在CheckStartPage处理器之后,那么它只会在成功登录时受到打击,因为CheckStartPage如果用户名/密码组合验证失败,该进程会中止管道。我不确定如何检查被锁定的用户,但看起来您应该能够在处理器之前添加CheckStartPage处理器或覆盖该处理器。

我的测试和反思是在 Sitecore 6.6 解决方案上完成的。

于 2013-03-13T16:14:42.413 回答