Create User Wizard - Sitefinity 4
Hi,
Since Sitefinity 4 uses a custom security API, the create user wizard control needs to be updated. I would like to post my working code for the Create User Wizard using Sitefinity 4:
CreateUserWizard.ascx:
<asp:CreateUserWizard ID="CreateUserWizard1" runat="server" CreateUserButtonText="Sign up" CreateUserButtonStyle-CssClass="test" ><CreateUserButtonStyle CssClass="test"></CreateUserButtonStyle> <WizardSteps> <asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server"> <ContentTemplate> <table> <tr> <td> <asp:Label AssociatedControlID="FirstName" ID="FirstNameLabel" runat="server" Text="First name <em>(optional)</em> :" /> </td><td> <asp:TextBox ID="FirstName" runat="server" Width="180px" /> <asp:RequiredFieldValidator ID="FirstNameRequired" runat="server" ControlToValidate="FirstName" ErrorMessage="FirstName is required." ToolTip="FirstName is required." ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator> </td> </tr> <tr> <td> <asp:Label AssociatedControlID="LastName" ID="LastNameLabel" runat="server" Text="Last name <em>(optional)</em> :" /></td> <td> <asp:TextBox ID="LastName" runat="server" Width="180px" /> <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="LastName" ErrorMessage="LastName is required." ToolTip="LastName is required." ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator> </td> </tr> <tr> <td> <asp:Label ID="UserNameLabel" runat="server" Width="180px" AssociatedControlID="UserName">User name:</asp:Label> </td> <td> <asp:TextBox ID="UserName" runat="server" Width="180px"></asp:TextBox> </td> </tr> <tr> <td> <asp:Label ID="PasswordLabel" runat="server" AssociatedControlID="Password">Password:</asp:Label> </td> <td> <asp:TextBox ID="Password" runat="server" TextMode="Password" Width="180px"></asp:TextBox> <asp:RequiredFieldValidator ID="PasswordRequired" runat="server" ControlToValidate="Password" ErrorMessage="Password is required." ToolTip="Password is required." ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator> </td> </tr> <tr> <td> <asp:Label ID="ConfirmPasswordLabel" runat="server" AssociatedControlID="ConfirmPassword">Confirm password:</asp:Label> </td> <td> <asp:TextBox ID="ConfirmPassword" runat="server" TextMode="Password" Width="180px"></asp:TextBox> <asp:RequiredFieldValidator ID="ConfirmPasswordRequired" runat="server" ControlToValidate="ConfirmPassword" ErrorMessage="Confirm Password is required." ToolTip="Confirm Password is required." ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator> </td> </tr> <tr> <td> <asp:Label ID="QuestionLabel" runat="server" AssociatedControlID="Question" Width="180px">Security question:</asp:Label> </td> <td> <asp:TextBox ID="Question" runat="server" Width="180px"></asp:TextBox> <asp:RequiredFieldValidator ID="QuestionRequired" runat="server" ControlToValidate="Question" ErrorMessage="Security question is required." ToolTip="Security question is required." ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator> </td> </tr> <tr> <td> <asp:Label ID="AnswerLabel" runat="server" AssociatedControlID="Answer" Width="180px">Security answer:</asp:Label> </td> <td> <asp:TextBox ID="Answer" runat="server" Width="180px"></asp:TextBox> <asp:RequiredFieldValidator ID="AnswerRequired" runat="server" ControlToValidate="Answer" ErrorMessage="Security answer is required." ToolTip="Security answer is required." ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator> </td> </tr> <tr> <td> <asp:Label ID="EmailLabel" runat="server" AssociatedControlID="Email" Width="180px">Email:</asp:Label> </td> <td> <asp:TextBox ID="Email" runat="server" Width="180px"></asp:TextBox> <asp:RequiredFieldValidator ID="EmailRequired" runat="server" ControlToValidate="Email" ErrorMessage="E-mail is required." ToolTip="E-mail is required." ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator> </td> </tr> <caption> <p> <asp:CompareValidator ID="PasswordCompare" runat="server" ControlToCompare="Password" ControlToValidate="ConfirmPassword" Display="Dynamic" ErrorMessage="The Password and Confirmation Password must match." ValidationGroup="CreateUserWizard1"></asp:CompareValidator> </p> <p class="errorMsg"> <asp:Literal ID="ErrorMessage" runat="server" EnableViewState="False"></asp:Literal> </p> </caption> </table> </ContentTemplate> <CustomNavigationTemplate> <div id="stepnextbuttondiv"> <p class="sfSubmitBtn sfMainFormBtns" <asp:LinkButton ID="StepNextButton" runat="server" CssClass="sfLinkBtnIn" CommandName="MoveNext" Text="Create User" ValidationGroup="CreateUserWizard1" /></p></div> </CustomNavigationTemplate> </asp:CreateUserWizardStep> <asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server"> <ContentTemplate> <p><strong>Your account has been successfully created.</strong></p> <p><asp:Button ID="ContinueButton" runat="server" CausesValidation="False" CommandName="Continue" Text="Continue" ValidationGroup="CreateUserWizard1" /></p> </ContentTemplate> </asp:CompleteWizardStep> </WizardSteps></asp:CreateUserWizard>using System;using System.Linq;using System.Web.UI.WebControls;using Telerik.Sitefinity.Security;namespace SitefinityWebApp.UserControls.Login public partial class CreateUserWizardControl : System.Web.UI.UserControl //Instantate the manager objects, so I can disable security checks UserManager manager = UserManager.GetManager("Default"); RoleManager Rmanager = RoleManager.GetManager("Default"); public void Page_Load(object sender, EventArgs e) //Suppress all security checks. This ensures that unauthenticated users can create user accounts manager.Provider.SuppressSecurityChecks = true; Rmanager.Provider.SuppressSecurityChecks = true; //Call the created user event because this control uses Sitefinity API for security, instead of .NET provider this.CreateUserWizard1.CreatedUser +=new EventHandler(CreateUserWizard1_CreatedUser); void CreateUserWizard1_CreatedUser(object sender, EventArgs e) //Create the role, if it does not exist if (!Rmanager.RoleExists("RegisteredUsers")) Rmanager.CreateRole("RegisteredUsers"); //Get first name and last name variables TextBox FirstName = (TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("FirstName"); TextBox LastName = (TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("LastName"); //get the user var user = manager.GetUserByEmail(CreateUserWizard1.Email); //Add the user to the role Rmanager.AddUserToRole(user, Rmanager.GetRoles().Where(q => q.Name == "RegisteredUsers").First()); //Don't forget to save changes Rmanager.SaveChanges(); //Update the user's information user.FirstName = FirstName.Text; user.LastName = LastName.Text; //Save the changes manager.SaveChanges(); Thanks!
Hi Joseph
Many thanks for this. I am having problem at the last line (line 14) in below code;
01.public const string ApplicantUserRole = "Applicant"; 02.UserManager manager = UserManager.GetManager("Default"); 03.RoleManager Rmanager = RoleManager.GetManager("Default"); 04.void CreateUserWizard1_CreatedUser(object sender, EventArgs e) 05. 06. //Create the role, if it does not exist 07. if (!Rmanager.RoleExists(ApplicantUserRole)) 08. 09. Rmanager.CreateRole(ApplicantUserRole); 10. 11. //get the user 12. var user = manager.GetUserByEmail(CreateUserWizard1.Email); 13. //Add the user to the role 14. Rmanager.AddUserToRole(user, Rmanager.GetRoles().Where(q => q.Name == ApplicantUserRole).First()); 15.The error I'm getting is;
Exception Details: System.InvalidOperationException: No items found in the sequence.
I suspect the role "Applicant" is not being created.
Any ideas how to fix this?
Thanks
Regards
Hi John01,
You use First(), but your query does not return items which results in the error you see.
You can use FirstOrDefault instead.
All the best,
Ivan Dimitrov
the Telerik team
Hi
I have checked in backend and role "Applicant" is not created. What is the correct code to create roles as;
public const string ApplicantUserRole = "Applicant";
RoleManager Rmanager = RoleManager.GetManager("Default");
if (!Rmanager.RoleExists(ApplicantUserRole))
Rmanager.CreateRole(ApplicantUserRole);
did not seem to have worked?
Thanks
Regards
Hi,
You have to call SaveChanges of the manager.
Kind regards,
Ivan Dimitrov
the Telerik team
Hi
Many thanks.
I need two more features please;
a. I need to add additional fields to Create User Wizard. How does that work with SF provider? Where and how do the additional fields get stored?
b. How do I make the created users have access to some pages but not to others?
Thanks
Regards
Hi Joseph,
a. I need to add additional fields to Create User Wizard. How does that work with SF provider? Where and how do the additional fields get stored?
Create User Wizard uses the Membership Provider. If you want to use additional fields you can use Profile provider represented by ProfileManager class.
b. How do I make the created users have access to some pages but not to others?
You can set permissions per page from the UI.
Hi all
Finally getting to look at SF4 for a project.
Looking for a new user registration control. Do I really need to create it myself? Amazed that this in not included in the release or am I missing something?
M
Hi mattc,
There are no plans for a new registration control for the Q1 release. We will consider adding our own control after that. As you have already noticed CreateUserWizard will do the trick.
Regards,
Ivan Dimitrov
the Telerik team
Hi Ivan
Yes fair enough, the CreateUserWizard works pretty smoothly :)
Thanks
Matt