Handle Logged In Event
Afternoon all,
I'm new to the 4.1 model of Sitefinity. I would like to override (or handle) an event that fires after a user has logged into Sitefinity. I need to fire some environment specific code that shoves some information into session state.
I could handle this in my membership provider, but I was trying to find a way to isolate this code outside my provider (for reasons of portability in the near future).
Thanks everybody!
Joel
Hi Joel,
There aren't global events that are thrown when a user tries to log in or it gets log out. For the time being I think that you should handle this in your provider.
All the best,
Ivan Dimitrov
the Telerik team
Thanks Ivan!
Sadly, my vendor has built all of their code on top of user controls and obfuscated their code. So I need a page lifecycle in order to properly instanciate their classes.
I've built my own login user control to get around the issue, but I'd like to know: can I add to the existing sitefinity login page? I seem to remember finding the existing codebase in 3.7, but I didn't know if that held thru to 4.1.
If I cannot modify (or add some code) to the existing Sitefinity login page, can I direct all logins to my login page? (I believe that I have tried setting it in the web.config's membership section to no avail, but I'm more than willing to try again).
Thank you sir!
Joel
Hi Joel,
I suppose that you want to modify the backend login control. There are two options
1. Map the external template and subscriber for Authenticate event directly in the ascx
You can simply map the templates for LoginForm and LogoutForm in the backend by going to Administration->Settings->Advanced->Controls>ViewMap->Create new and fill in the fields accordingly(all without the quotes):
for LoginForm:
HostType: Telerik.Sitefinity.Security.Web.UI.LoginForm
LayoutTemplatePath: "relative path to your custom LoginForm.ascx where you have specified the custom paths to the ChangePassword and ForgotPassword pages"
for LogoutForm:
HostType: Telerik.Sitefinity.Security.Web.UI.LogoutForm
LayoutTemplatePath: "relative path to your custom LogoutForm.ascx where you have specified the custom path to the ChangePassword page"
default templates
<%@ Register Assembly="Telerik.Sitefinity" Namespace="Telerik.Sitefinity.Web.UI" TagPrefix="sitefinity" %><%@ Register Assembly="Telerik.Sitefinity" Namespace="Telerik.Sitefinity.Web.UI.Fields" TagPrefix="sffields" %><%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %><%@ Control Language="C#" %><sitefinity:ResourceLinks ID="resourcesLinks" runat="server"> <sitefinity:ResourceFile JavaScriptLibrary="JQuery"> </sitefinity:ResourceFile></sitefinity:ResourceLinks><sitefinity:ClientLabelManager id="clientLabelManager" runat="server"> <Labels> <sitefinity:ClientLabel ClassId="Labels" Key="SelfLogoutUserConfirm" runat="server" /> <sitefinity:ClientLabel ClassId="Labels" Key="UserNotSelected" runat="server" /> <sitefinity:ClientLabel ClassId="Labels" Key="LogoutUserConfirm" runat="server" /> </Labels></sitefinity:ClientLabelManager><sffields:FormManager runat="server" id="formManager" /><asp:Panel ID="loginPanel" runat="server"> <div class="sfForm"> <div class="sfFormIn"> <div class="sfLoginShadowTopRight"> </div> <div class="sfLoginShadowBottomLeft"> </div> <h2> <asp:Literal ID="LoginTitle" Text="<%$ Resources:Labels, LoginToManage %>" runat="server" /> </h2> <asp:Label runat="server" ID="FailureText" EnableViewState="False" Visible="false" CssClass="sfFailure" /> <ol> <li id="ProvidersHolder" runat="server"> <asp:Label ID="ProvidersLabel" Text="<%$ Resources:Labels, Provider %>" AssociatedControlID="ProvidersList" runat="server" CssClass="sfTxtLbl" /> <asp:DropDownList ID="ProvidersList" AutoPostBack="false" AccessKey="l" runat="server" /> </li> <li> <asp:Label ID="UserNameLabel" Text="<%$ Resources:Labels, Username %>" AssociatedControlID="UserName" runat="server" CssClass="sfTxtLbl" /> <asp:TextBox ID="UserName" AccessKey="u" runat="server" CssClass="sfTxt" /> <asp:RequiredFieldValidator ID="UserNameRequired" Display="Dynamic" ControlToValidate="UserName" ValidationGroup="LoginBox" ErrorMessage="<%$ Resources:Labels, UsernameCannotBeEmpty %>" CssClass="sfValidator" runat="server"> <strong><asp:Literal ID="UserNameRequiredLiteral" runat="server" Text="<%$ Resources:Labels, UsernameCannotBeEmpty %>" /></strong> </asp:RequiredFieldValidator> </li> <li> <asp:Label ID="PasswordLabel" Text="<%$ Resources:Labels, Password %>" AssociatedControlID="Password" runat="server" CssClass="sfTxtLbl" /> <asp:TextBox ID="Password" TextMode="Password" AccessKey="p" runat="server" CssClass="sfTxt" /> <asp:RequiredFieldValidator ID="PasswordRequired" Display="Dynamic" ControlToValidate="Password" ValidationGroup="LoginBox" ErrorMessage="<%$ Resources:Labels, PasswordCannotBeEmpty %>" CssClass="sfValidator" runat="server"> <strong><asp:Literal ID="PasswordRequiredLiteral" runat="server" Text="<%$ Resources:Labels, PasswordCannotBeEmpty %>" /></strong> </asp:RequiredFieldValidator> </li> <li class="sfCheckBoxWrapper"> <asp:CheckBox runat="server" ID="RememberMe" /> <asp:Label ID="RememberMeTextLabel" Text="<%$ Resources:Labels, RememberMe %>" AssociatedControlID="RememberMe" runat="server" /> </li> </ol> <p class="sfSubmitBtn sfMainFormBtns"> <asp:LinkButton ID="LoginButton" CommandName="Login" CssClass="sfLinkBtn sfSave" ValidationGroup="LoginBox" runat="server"> <strong class="sfLinkBtnIn"> <asp:Literal ID="LoginButtonLiteral" runat="server" Text="<%$ Resources:Labels, LoginCaps %>"></asp:Literal> </strong> </asp:LinkButton> <!-- do not remove this button. It is used for the default form submit (pressing enter) --> <div style="display: none;"> <asp:Button ID="hiddenSubmitButton" runat="server" CommandName="Login" ValidationGroup="LoginBox" /> </div> </p> </div> </div></asp:Panel><asp:Panel ID="userListPanel" runat="server" Visible="false"> <div class="sfForm"> <div class="sfFormIn"> <div class="sfLoginShadowTopRight"></div> <div class="sfLoginShadowBottomLeft"></div> <h2><asp:Literal ID="UsersListPanelLoginTitle" Text="<%$ Resources:Labels, LoginToManage %>" runat="server" /></h2> <p class="sfNeutral"><asp:Literal ID="userLimitLabel" runat="server" Text="<%$ Resources:Labels, UserLimitLabel%>" /></p> <sffields:ChoiceField runat="server" id="userListChoice" RenderChoicesAs="RadioButtons" DisplayMode="Write" /> <p class="sfSubmitBtn sfMainFormBtns"> <asp:LinkButton ID="logoutButton" runat="server" OnClientClick="return AlertLogOut();" CssClass="sfLinkBtn sfPrimary"> <strong class="sfLinkBtnIn"> <asp:Literal ID="LogoutButtonLiteral" runat="server" Text="<%$ Resources:Labels, LogoutButtonText%>"></asp:Literal> </strong> </asp:LinkButton> </p> </div> </div></asp:Panel><asp:Panel ID="selfLogoffPanel" runat="server" Visible="false"> <div class="sfForm"> <div class="sfFormIn"> <div class="sfLoginShadowTopRight"></div> <div class="sfLoginShadowBottomLeft"></div> <h2><asp:Literal ID="SelfLogoffPanelLoginTitle" Text="<%$ Resources:Labels, LoginToManage %>" runat="server" /></h2> <p class="sfNeutral"><asp:Literal ID="selfLogoffLabel" runat="server" Text="<%$ Resources:Labels, SelfLogoffLabel%>" /></p> <p class="sfSubmitBtn sfMainFormBtns"> <asp:LinkButton ID="selfLogoutButton" runat="server" OnClientClick="return AlertSelfLogOut();" CssClass="sfLinkBtn sfPrimary"> <strong class="sfLinkBtnIn"> <asp:Literal ID="LogoutOtherUserAndEnterLiteral" runat="server" Text="<%$ Resources:Labels, SelftLogoutButtonText%>"></asp:Literal> </strong> </asp:LinkButton> <asp:LinkButton ID="selfLogoutCancelButton" runat="server" Text="<%$ Resources:Labels, Cancel%>" CssClass="sfCancel" /> </p> </div> </div></asp:Panel><asp:Panel ID="denyLogonPanel" runat="server" Visible="false"> <div class="sfForm"> <div class="sfFormIn"> <div class="sfLoginShadowTopRight"></div> <div class="sfLoginShadowBottomLeft"></div> <h2><asp:Literal ID="DenyLogonPanelLoginTitle" Text="<%$ Resources:Labels, LoginToManage %>" runat="server" /></h2> <p class="sfNeutral"><asp:Literal ID="denyLogonMesage" runat="server" Text="<%$ Resources:Labels, DenyLogonMesage%>" /></p> <p><asp:Literal ID="loginRetryMessage" runat="server" Text="<%$ Resources:Labels, LoginRetryMessage%>" /></p> </div> </div></asp:Panel><asp:PlaceHolder ID="loginLinksHolder" runat="server"> <div class="sfLoginHelp"> <asp:Literal ID="HelpTitleLiteral" runat="server" Text="<%$ Resources:Labels, Help %>" />: <a id="PasswordRecoveryLink" href="~/Sitefinity/Login/PasswordRecovery" runat="server" onclick="toggleSmtpErrorMessage();"> <asp:Literal ID="PasswordRecoveryTextLiteral" runat="server" Text="<%$ Resources:Labels, ForgotYourPassword %>" /> </a> <a id="ChangePasswordLink" href="~/Sitefinity/Login/ChangePassword" runat="server" onclick="toggleSmtpErrorMessage();"> <asp:Literal ID="ChangePasswordTextLiteral" runat="server" Text="<%$ Resources:Labels, ChangePassword %>" /> </a> <a id="CreateUserLink" href="~/Sitefinity/Login/Register" runat="server"> <asp:Literal ID="RegisterUserTextLiteral" runat="server" Text="<%$ Resources:Labels, Register %>" /> </a> <a id="HelpLink" href="~/Sitefinity/Help/UsersAndRoles/LoggingIn" runat="server"> <asp:Literal ID="HelpLinkLiteral" runat="server" Text="<%$ Resources:Labels, Help %>" /> </a> </div></asp:PlaceHolder><div id="smtpNotSetContainer" class="sfNeutral sfDetailedInfo" style="display:none;"> <h3> <asp:Literal ID="ErrorMessageNoSmtpConfigLiteral" runat="server" Text="<%$ Resources:ErrorMessages, TheSystemHasNotBeenConfiguredToSendEmails %>" /> </h3> <ul> <li><asp:Literal ID="ErrorMessageContactAdminToResetYourPasswordLiteral" runat="server" Text="<%$ Resources:ErrorMessages, ContactAnAdministratorToResetYourPasswordManually %>" /></li> <li> <asp:Literal ID="ErrorOrAskAnAdministratorToConfigureTheSystemLiteral" runat="server" Text="<%$ Resources:ErrorMessages, OrAskAnAdministratorToConfigureThSystem %>" /> <a href="javascript:void(0)" onclick="toggleVisibility('smtpNotSetSolution')"> <asp:Literal ID="ErrorMessageSmtpDetailsTitle" runat="server" Text="<%$ Resources:ErrorMessages, Details %>" /> </a> </li> </ul> <div id="smtpNotSetSolution" class="sfDetailedHowTo" style="display: none; "> <p><asp:Literal ID="ErrorMessageSmtpSettingsNotSetLiteral" runat="server" Text="<%$ Resources:ErrorMessages, SmtpSettingsAreNotSet %>" /></p> <h3><asp:Literal ID="ErrorMessageHowToSetSmtpLiteral" runat="server" Text="<%$ Resources:ErrorMessages, HowToSetSMTP %>" /></h3> <ol> <li><asp:Literal ID="Literal20" runat="server" Text="<%$ Resources:ErrorMessages, GoToSettingsConfiguration %>" /></li> <li><asp:Literal ID="Literal21" runat="server" Text="<%$ Resources:ErrorMessages, SelectSystemSMTPSettings %>" /></li> </ol> </div></div><div id="smtpPermissionDeniedContainer" class="sfNeutral sfDetailedInfo" style="display:none;"> <h3> <asp:Literal ID="ErrorMessageTheSysIsNotPermittedToSendEmailsLiteral" runat="server" Text="<%$ Resources:ErrorMessages, TheSystemHasIsNotPermittedToSendEmails %>" /> </h3> <ul> <li><asp:Literal ID="ErrorMessageContactAdminToResetYourPasswordSmtpLiteral" runat="server" Text="<%$ Resources:ErrorMessages, ContactAnAdministratorToResetYourPasswordManually %>" /></li> <li> <asp:Literal ID="ErrorOrAskAnAdministratorToConfigureTheSystemSmtpLiteral" runat="server" Text="<%$ Resources:ErrorMessages, OrAskAnAdministratorToConfigureThSystem %>" /> <a href="javascript:void(0)" onclick="toggleVisibility('smtpPermissionsDeniedDetails')"> <asp:Literal ID="ErrorMessageSmtpPermissionDeniedDetailsTitle" runat="server" Text="<%$ Resources:ErrorMessages, Details %>" /> </a> </li> </ul> <div id="smtpPermissionsDeniedDetails" class="sfDetailedHowTo" style="display: none; "> <p><asp:Literal ID="SmtpPermissionErrorMessage" runat="server" /></p> </div></div><asp:HiddenField id="logoutUser" runat="server" value="" /><asp:HiddenField id="loginTicket" runat="server" value="" /><asp:HiddenField id="mode" runat="server" value="" /><asp:HiddenField id="smtpSettingsAreSet" runat="server" value="" /><asp:HiddenField id="smtpPermissionDenied" runat="server" value="" /><telerik:RadCodeBlock runat="server"><script type="text/javascript"> var userChoices; var smtpSettingsAreSet; var smtpPermissionDenied; function pageLoad() userChoices = $find("<%= userListChoice.ClientID %>"); smtpSettingsAreSet = getBooleanHiddenField("<%= smtpSettingsAreSet.ClientID %>"); smtpPermissionDenied = getBooleanHiddenField("<%= smtpPermissionDenied.ClientID %>"); function getBooleanHiddenField(id) var field = $get(id); if (field !== null && field.value) return Boolean.parse(field.value); return false; function toggleVisibility() var elem = arguments[0] ? document.getElementById(arguments[0]) : this; if (elem.style.display == "block") elem.style.display = "none"; else elem.style.display = "block"; function toggleSmtpErrorMessage() if (!smtpSettingsAreSet) toggleVisibility('smtpNotSetContainer'); else if (smtpPermissionDenied) toggleVisibility('smtpPermissionDeniedContainer'); function AlertSelfLogOut() var clientLabelManager = $find('<%= clientLabelManager.ClientID %>'); var result = confirm(clientLabelManager.getLabel('Labels', 'SelfLogoutUserConfirm')); return result; function AlertLogOut() var clientLabelManager = $find('<%= clientLabelManager.ClientID %>'); var value = userChoices.get_value(); if (value == null || value.length == 0) alert(clientLabelManager.getLabel('Labels', 'UserNotSelected')); return false; var selectedItemId = userChoices.get_value(); // selectedItem[0].id; var result = confirm(clientLabelManager.getLabel('Labels', 'LogoutUserConfirm')); if (result) $get('<%= logoutUser.ClientID %>').value = value; return result; </script></telerik:RadCodeBlock><%@ Control Language="C#" %><%@ Register Assembly="Telerik.Sitefinity" Namespace="Telerik.Sitefinity.Web.UI" TagPrefix="sf" %><div class="sfForm"> <div class="sfFormIn"> <div class="sfLoginShadowTopRight"></div> <div class="sfLoginShadowBottomLeft"></div> <h2> <asp:Literal ID="Literal1" Text="<%$ Resources:Labels, LoginToManage %>" runat="server" /> </h2> <p class="sfSuccess"> <asp:Literal ID="LoginStatus" runat="server" /> </p> <asp:PlaceHolder ID="MessageHolder" runat="server"> <p> <asp:Literal ID="Message" runat="server" /> </p> </asp:PlaceHolder> <p> <asp:Literal Text="<%$ Resources:Labels, WhatToDo %>" runat="server" /> </p> <ul class="sfLoginHelp"> <li> <asp:LinkButton ID="Logout" Text="<%$ Resources:Labels, Logout %>" runat="server" /> </li> <li> <asp:LinkButton ID="SwitchUser" Text="<%$ Resources:Labels, SwitchUser %>" runat="server" /> </li> <li> <sf:SitefinityHyperLink ID="ChangePassword" NavigateUrl="~/Sitefinity/Login/ChangePassword" Text="<%$ Resources:Labels, ChangePassword %>" runat="server" /> </li> </ul> </div></div>