Search code examples
asp.netasp.net-membershipumbracoumbraco7

Umbraco :: Catching or Extending User Login


I am trying to catch the login event of Umbraco Users (login in the CMS).

I have tried to extend from MembersMembershipProvider and override the ValidateUser method. I also changed the web.config to use my class. When i put a breakpoint in this overrited method it doesnt stop and logsin the user as usual.

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

Thanks in advance.


Solution

  • As Jannik said, Umbraco uses ASP.NET Identity in the latest couple of versions, so the MembershipProvider is not used to validate and authenticate the user anymore.

    So after a couple hours of research, i found a workaround solution:

    1º - Create a custom UserManager, and override the method 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º - Then in your owin startup, you can use this block of code for your 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);
                });
    

    This solution ill keep using the umbraco UserStore and the base methods of UserManager.