I have come to realize that many people have the need in their DotNetNuke (DNN) applications to create a new user "on-the-fly". Here is how to do it...
First of all, thank you to those who helped me troubleshoot this in the DotNetNuke forums.
You obviously will want to create your own class and take advantage of the Membership, Profile, and Role providers that are in place. In order to effectively debug this code, I found it necessary to create duplicates of those providers. Here is the finalized code snippet that I know to work in DNN v4.05.01 through v4.05.03:
'' Put the following method into your own class' This method assumes that you have these local properties:' "User" As DotNetNuke.Entities.Users.UserInfo' "PortalSettings" As DotNetNuke.Entities.Portals.PortalSettings'' IMPORTANT - There are extra line breaks added using the VB _' to prevent breaking the design.'Public Function CreateNewUser(ByVal strUsername As String, _ ByVal strFirstName As String, ByVal strLastName As String, _ ByVal strEmailAddress As String, ByVal blnMembershipApproved _ As Boolean) As DotNetNuke.Security.Membership.UserCreateStatus
'=========================================================== ' ' BEGIN VALIDATION ' '===========================================================
' preliminary check to be sure that the fields are filled in ' (cannot have empty values) If String.IsNullOrEmpty(strUsername) Then _ Throw New NullReferenceException(String.ConCat( _ "The USERNAME ", _ "variable for CreateNewUser() cannot be empty.")) If String.IsNullOrEmpty(strFirstName) Then _ Throw New NullReferenceException(String.ConCat( _ "The FIRSTNAME ", _ "variable for CreateNewUser() cannot be empty.")) If String.IsNullOrEmpty(strLastName) Then _ Throw New NullReferenceException(String.ConCat( _ "The LASTNAME ", _ "variable for CreateNewUser() cannot be empty.")) If String.IsNullOrEmpty(strEmailAddress) Then _ Throw New NullReferenceException(String.ConCat( _ "The EMAILADDRESS ", _ "variable for CreateNewUser() cannot be empty."))
' validate the e-mail address format ' I have a Regular Expression that is used globally for all e-mail ' validation... You can use your own here If Not _ MYNAMESPACE.Common.Utilities.RegExLibrary.ValidateEmailFormat( _ strEmailAddress _ ) Then _ Throw New Exception( _ "The e-mail address was in an invalid format")
'=========================================================== ' ' END VALIDATION ' '===========================================================
' create a new user instance and populate it Me.User = New DotNetNuke.Entities.Users.UserInfo With Me.User .Profile.InitialiseProfile(Me.PortalSettings.PortalId) .AffiliateID = -1 .DisplayName = String.Concat(strFirstName, " ", _ strLastName) .Email = strEmailAddress .FirstName = strFirstName .IsSuperUser = False .Membership.Approved = blnMembershipApproved .Membership.CreatedDate = DateTime.Now .Membership.Email = strEmailAddress ' Use the built-in password generation, or your own ' Also, you can ammend this method to pass the password ' along with the other info '.Membership.Password = _ ' DotNetNuke.Entities.Users.UserController.GeneratePassword .Membership.Password = _ MYNAMESPACE.Security.PasswordGenerator.Generate(8, 10) ' Since the password is generated, force the visitor to ' change it when they log in .Membership.UpdatePassword = True .Membership.Username = strUsername .PortalID = Me.PortalSettings.PortalId .Username = strUsername .Profile.FirstName = strFirstName .Profile.LastName = strLastName .Profile.PreferredLocale = Me.PortalSettings.DefaultLanguage .Profile.TimeZone = Me.PortalSettings.TimeZoneOffset End With
' I am now handling this in the customized ' profile/membership provider(s)... ' It is up to you as to how you want to handle this... ' but below should be your "default" ' Set the Approved status based on the Portal Settings 'If Me.PortalSettings.UserRegistration = _ ' Globals.PortalRegistrationType.PublicRegistration Then ' Me.User.Membership.Approved = True 'Else ' Me.User.Membership.Approved = False 'End If
' This is the line that actually performs the creation of the user ' (through the providers) ' attempt to create the DNN user Dim objStatus As UserCreateStatus = _ DotNetNuke.Entities.Users.UserController.CreateUser(Me.User)
' set-up the arguments for the status of the user creation Dim args As Modules.UserUserControlBase.UserCreatedEventArgs If objStatus = UserCreateStatus.Success Then args = New _ Modules.UserUserControlBase.UserCreatedEventArgs(Me.User) args.Notify = True Else ' registration error args = New _ Modules.UserUserControlBase.UserCreatedEventArgs(Nothing) args.Notify = False End If args.CreateStatus = objStatus
' I copied the DNN source code for notifying the user that the ' user account was created, and it is referenced here... ' perform some DNN logic Me.UserCreateCompleted(args)
' return the enumerated result to be handled accordingly Return objStatus