You can create and create your own module, and then copy the DLL to the bin folder of the Umbraco installation. No need to recompile Umbraco itself.
I had a very similar problem, but perhaps with less demand. I tried to implement the "last login" functionality as described in the Umbraco television video to display the last recorded date of the participants. When the code base has changed, the described method is no longer valid. I found that there are two general ways to make it work:
Create your own membership provider. Inherit from UmbracoMembershipProvider and update your web configuration to use your provider. I tried one method and my provider code looked like this:
using umbraco.BusinessLogic; using System.Web.Profile; using System; namespace zo.Umb.LastLogin { // this approac works, and it may be necessary to extend the membership provider in the future, so that why I'm // leaving it here. But for now I'm using the ApplicationStartupHandler event subscription method // in MemberEvent.cs /// <summary> /// Inherit the default membership provider and substitute my own method that fired when a member tries /// to log in. Note that you must also replace the UmbracoMembershipProvider reference in the web.config /// with a reference to this one. eg: /// <add name="UmbracoMembershipProvider" type="zo.Umb.LastLogin.MyMembershipProvider" enablePasswordRetrieval="false" enablePasswordReset="false" requiresQuestionAndAnswer="false" defaultMemberTypeAlias="Another Type" passwordFormat="Hashed" /> /// /// also note that, to have custom profile properties appear, they must also be added in the web.config /// like so: /// <profile defaultProvider="UmbracoMemberProfileProvider" enabled="true"> /// <providers> /// <clear /> /// <add name="UmbracoMemberProfileProvider" type="umbraco.providers.members.UmbracoProfileProvider, umbraco.providers" /> /// </providers> /// <properties> /// <clear /> /// <add name="lastLogin" allowAnonymous ="false" provider="UmbracoMemberProfileProvider" type="System.DateTime" /> /// </properties> ///</profile> /// </summary> public class MyMembershipProvider : umbraco.providers.members.UmbracoMembershipProvider { public override bool ValidateUser(string username, string password) { var success = base.ValidateUser(username, password); if (success) { var user = GetUser(username, true); var profile = ProfileBase.Create(user.UserName); profile["lastLogin"] = DateTime.Now; profile.Save(); } return success; } } }
ValidateUser starts when a user tries to get protected content.
Note that now you need to update the web.config file by pointing to your custom membership provider.
While this worked, I did not like moving the default provider, editing web.config, etc. and wanted to use the more โstandardโ approach of the previous version. So I used method 2:
Submit to ApplicationStartupHandler and subscribe to Member.BeforeSave
using System; //using umbraco.BusinessLogic; using umbraco.businesslogic; using umbraco.cms.businesslogic.member; namespace zo.Umb.LastLogin { public class MemberEvent : ApplicationStartupHandler { public MemberEvent() { Member.BeforeSave += new Member.SaveEventHandler(Member_BeforeSave); } void Member_BeforeSave(Member sender, umbraco.cms.businesslogic.SaveEventArgs e) { //Log.Add(LogTypes.Debug, sender.Id, "Member_AfterAddToCache"); sender.getProperty("lastLogin").Value = DateTime.Now; } } }
If I remember, member.beforesave is not what was done when the user was created and saved in the membership repository; it actually starts when the user logs in.