Umbraco ::捕获或扩展用户登录

时间:2016-10-04 15:19:20

标签: asp.net asp.net-membership umbraco umbraco7

我正在尝试捕获Umbraco用户的登录事件(在CMS中登录)。

我尝试从MembersMembershipProvider扩展并覆盖ValidateUser方法。我还更改了web.config以使用我的类。 当我在这个覆盖的方法中放置一个断点时,它不会停止并像往常一样登录用户。

public class CustomUmbracoMembershipProvider : Umbraco.Web.Security.Providers.UsersMembershipProvider
{
    public override bool ValidateUser(string username, string password)
    {
        return base.ValidateUser(username, password);
    }
}

提前致谢。

3 个答案:

答案 0 :(得分:1)

正如Jannik所说,Umbraco在最新的几个版本中使用ASP.NET Identity,因此MembershipProvider不再用于验证和验证用户。

经过几个小时的研究,我发现了一种解决方案:

1º - 创建自定义UserManager,并覆盖方法CheckPasswordAsync:

public class CustomBackOfficeUserManager : BackOfficeUserManager
{
    public CustomBackOfficeUserManager(
        IUserStore<BackOfficeIdentityUser, int> store,
        IdentityFactoryOptions<BackOfficeUserManager> options,
        MembershipProviderBase membershipProvider) :
        base(store, options, membershipProvider)
    {
    }

    /// <summary>
    /// Returns true if the password is valid for the user
    /// </summary>
    /// <param name="user"/><param name="password"/>
    /// <returns/>
    public override Task<bool> CheckPasswordAsync(BackOfficeIdentityUser user, string password)
    {
        //Your implementation

        var result = base.CheckPasswordAsync(user, password).Result;

        return Task.FromResult(result);
    }
}

2º - 然后在你的owin启动中,你可以使用这个代码块来配置你的ConfigureUserManagerForUmbracoBackOffice:

var appCtx = ApplicationContext;
        app.ConfigureUserManagerForUmbracoBackOffice<BackOfficeUserManager, BackOfficeIdentityUser>(
            appCtx,
            (options, context) =>
            {
                var membershipProvider = MembershipProviderExtensions.GetUsersMembershipProvider().AsUmbracoMembershipProvider();
                var store = new BackOfficeUserStore(
                    appCtx.Services.UserService,
                    appCtx.Services.ExternalLoginService,
                    membershipProvider);
                return new CustomBackOfficeUserManager(store, options, membershipProvider);
            });

此解决方案继续使用umbraco UserStore和UserManager的基本方法。

答案 1 :(得分:0)

由于Umbraco后端在最新版本中使用ASP.NET身份,因此询问您使用的确切版本可能也是相关的。

我认为ASP.NET Identity有一个OnLoggedIn事件,您可以尝试:https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.login.onloggedin.aspx

但我并非100%确定该链接是最新的。

答案 2 :(得分:0)

我有类似的情况。这在Umbraco 7.6.5中对我有用。我知道它不优雅。这只是一种解决方法:

public class MyCustomEvents: ApplicationEventHandler
{
    protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
    {
        base.ApplicationStarted(umbracoApplication, applicationContext);
        UserService.SavedUser += UserServiceSaved;
    }

    private void UserServiceSaved(IUserService sender, SaveEventArgs<IUser> e)
    {
        foreach(IUser user in e.SavedEntities)
        {
            if (!user.IsNewEntity()) //Is not creating a new user
            {
                IUser alreadyLoggedUser = UmbracoContext.Current.Security.CurrentUser;
                if (alreadyLoggedUser == null) //Is not a user management via backoffice
                {
                    if (user.FailedPasswordAttempts == 0) //Is a successful login?
                    {
                        DateTime justNow = DateTime.Now.AddSeconds(-5);
                        if (user.LastLoginDate.CompareTo(justNow) >= 0) //Logged in just now?
                        {
                            //Do your stuff
                        }
                    }
                }
            }
        }

    }
}