This project is read-only.

Create a custom module override to MembershipService ?

Topics: Writing modules
Jan 24, 2013 at 9:06 PM

I know this question has been asked before, just want to know exactly how.

So the answer would be: Create a custom module override to MembershipService ?

But imagine I will create a custom module call "MyModule", so I will then create MVC views/controllers in my module, correct?

However where should I override the MembershipService class?

In this case, do I need to create a custom Register/Login Views and Controllers in my module?

How to replace the default Orchard Register/Login pages?


Sorry too many questions...



Jan 25, 2013 at 9:15 PM

Any comments?

Jan 26, 2013 at 12:52 PM

 Create a custom module override to MembershipService ? Yes, then use OrchardSuppressDependency

You can replace them with your own like how I have done with the Shapes Class in my Open authentication module.

            builder.Describe("LogOn")                   .OnDisplaying(displaying => {
                        var shape = displaying.Shape;                        var metadata = displaying.ShapeMetadata;
                        shape.ClientsData = clientsData;
                        metadata.Type = "OpenAuthLogOn";                    });

            builder.Describe("Register")                   .OnDisplaying(displaying => {
                       var shape = displaying.Shape;                       var metadata = displaying.ShapeMetadata;
                       shape.ClientsData = clientsData;
                       metadata.Type = "OpenAuthRegister";                   });

Jan 27, 2013 at 11:51 AM


Is this what you mean?

1. Create and register a new module call MyModule;

2. Create a controller call: AccountModule.cs, and add following code (copied from src\Modules\Orchard.Users\Controllers\AccountController.cs)

3. Note it has been modified by adding a OrchardSuppressDependency.

However it doesn't work, the LogOn class hasn't been triggered at all (when debugging it).


namespace MyModule.Controllers
    public class AccountController : Controller
        private readonly IAuthenticationService _authenticationService;
        private readonly IMembershipService _membershipService;
        private readonly IUserService _userService;
        private readonly IOrchardServices _orchardServices;
        private readonly IEnumerable<IUserEventHandler> _userEventHandlers;

        public AccountController(
            IAuthenticationService authenticationService,
            IMembershipService membershipService,
            IUserService userService,
            IOrchardServices orchardServices,
            IEnumerable<IUserEventHandler> userEventHandlers)
            _authenticationService = authenticationService;
            _membershipService = membershipService;
            _userService = userService;
            _orchardServices = orchardServices;
            _userEventHandlers = userEventHandlers;
            Logger = NullLogger.Instance;
            T = NullLocalizer.Instance;

        public ILogger Logger { get; set; }
        public Localizer T { get; set; }

        public ActionResult LogOn()
            if (_authenticationService.GetAuthenticatedUser() != null)
                return Redirect("~/");

            var shape = _orchardServices.New.LogOn().Title(T("Log On").Text);
            return new ShapeResult(this, shape);

        [SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings",
            Justification = "Needs to take same parameter type as Controller.Redirect()")]
        public ActionResult LogOn(string userNameOrEmail, string password, string returnUrl, bool rememberMe = false)
            var user = ValidateLogOn(userNameOrEmail, password);
            if (!ModelState.IsValid)
                var shape = _orchardServices.New.LogOn().Title(T("Log On").Text);
                return new ShapeResult(this, shape);

            _authenticationService.SignIn(user, rememberMe);
            foreach (var userEventHandler in _userEventHandlers)

            return this.RedirectLocal(returnUrl);

        private IUser ValidateLogOn(string userNameOrEmail, string password)
            bool validate = true;

            if (String.IsNullOrEmpty(userNameOrEmail))
                ModelState.AddModelError("userNameOrEmail", T("You must specify a username or e-mail."));
                validate = false;
            if (String.IsNullOrEmpty(password))
                ModelState.AddModelError("password", T("You must specify a password."));
                validate = false;

            if (!validate)
                return null;

            var user = _membershipService.ValidateUser(userNameOrEmail, password);
            if (user == null)
                ModelState.AddModelError("_FORM", T("The username or e-mail or password provided is incorrect."));

            return user;

Jan 27, 2013 at 1:20 PM


OK, after "Enable" my module, once click the "Sign In" link on the portal homepage, I got this error in VS:

The controller for path '/Orchard.Web/Users/Account/LogOn' was not found or does not implement IController.