diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/System/SystemSettings.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/System/SystemSettings.cs index d713ba88..ba6a885f 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/System/SystemSettings.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/System/SystemSettings.cs @@ -56,6 +56,7 @@ namespace WebsitePanel.EnterpriseServer public const string TWILIO_PHONEFROM_KEY = "TwilioPhoneFrom"; public const string WEBDAV_PASSWORD_RESET_ENABLED_KEY = "WebdavPswResetEnabled"; + public const string WEBDAV_PASSWORD_RESET_LINK_LIFE_SPAN = "WebdavPswdResetLinkLifeSpan"; // key to access to wpi main & custom feed in wpi settings public const string WPI_MAIN_FEED_KEY = "WpiMainFeedUrl"; diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs index 13d20ed1..fbf7b81e 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs @@ -1877,7 +1877,9 @@ namespace WebsitePanel.EnterpriseServer var webdavPortalUrl = new Uri(settings["WebdavPortalUrl"]); - var token = CreateAccessToken(itemId, accountId, AccessTokenTypes.PasswrodReset); + var hours = settings.GetValueOrDefault(SystemSettings.WEBDAV_PASSWORD_RESET_LINK_LIFE_SPAN, 1); + + var token = CreateAccessToken(itemId, accountId, AccessTokenTypes.PasswrodReset, hours); tokenGuid = token.AccessTokenGuid; @@ -1892,7 +1894,7 @@ namespace WebsitePanel.EnterpriseServer return resultUrl.ToString(); } - private static AccessToken CreateAccessToken(int itemId, int accountId, AccessTokenTypes type) + private static AccessToken CreateAccessToken(int itemId, int accountId, AccessTokenTypes type, int hours) { var token = new AccessToken { @@ -1900,7 +1902,7 @@ namespace WebsitePanel.EnterpriseServer ItemId = itemId, AccountId = accountId, TokenType = type, - ExpirationDate = DateTime.Now.AddHours(12) + ExpirationDate = DateTime.Now.AddHours(hours) }; token.Id = DataProvider.AddAccessToken(token); @@ -2890,6 +2892,7 @@ namespace WebsitePanel.EnterpriseServer OrganizationUser retUser = orgProxy.GetOrganizationUserWithExtraData(accountName, org.OrganizationId); retUser.AccountId = accountId; + retUser.ItemId = itemId; retUser.AccountName = account.AccountName; retUser.PrimaryEmailAddress = account.PrimaryEmailAddress; retUser.AccountType = account.AccountType; diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/OrganizationProvider.cs b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/OrganizationProvider.cs index 0a35e6d0..04f06e04 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/OrganizationProvider.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/OrganizationProvider.cs @@ -576,6 +576,11 @@ namespace WebsitePanel.Providers.HostedSolution if (span != null) { + if (span.Value.Duration() == new TimeSpan().Duration()) + { + return TimeSpan.MaxValue; + } + return span.Value; } } @@ -679,15 +684,20 @@ namespace WebsitePanel.Providers.HostedSolution if (!FineGrainedPasswordPolicyExist(runspace, psoName)) { CreateFineGrainedPasswordPolicy(runspace, organizationId, psoName, settings); - - string groupPath = GetGroupPath(organizationId); - - SetFineGrainedPasswordPolicySubject(runspace, groupPath, psoName); } else { UpdateFineGrainedPasswordPolicy(runspace, psoName, settings); } + + string groupPath = GetGroupPath(organizationId); + + SetFineGrainedPasswordPolicySubject(runspace, groupPath, psoName); + + if (settings.MaxPasswordAge == 0) + { + SetPasswordNeverExpiresInFineGrainedPasswordPolicy(runspace, psoName); + } } catch (Exception ex) { @@ -706,6 +716,24 @@ namespace WebsitePanel.Providers.HostedSolution return string.Format("{0}-PSO", organizationId); } + private void SetPasswordNeverExpiresInFineGrainedPasswordPolicy(Runspace runspace, string psoName) + { + var psoObject = GetFineGrainedPasswordPolicy(runspace, psoName); + + var distinguishedName = GetPSObjectProperty(psoObject, "DistinguishedName") as string; + + var cmd = new Command("Set-ADObject"); + cmd.Parameters.Add("Identity", distinguishedName); + + var hashTable = new Hashtable(); + + hashTable.Add("msDS-MaximumPasswordAge", "-9223372036854775808"); + + cmd.Parameters.Add("Replace", hashTable); + + ExecuteShellCommand(runspace, cmd); + } + private bool FineGrainedPasswordPolicyExist(Runspace runspace, string psoName) { try @@ -759,12 +787,12 @@ namespace WebsitePanel.Providers.HostedSolution var cmd = new Command("Add-ADFineGrainedPasswordPolicySubject"); cmd.Parameters.Add("Identity", psoName); - cmd.Parameters.Add("Subjects", entry.Properties[ADAttributes.SAMAccountName].Value.ToString()); + cmd.Parameters.Add("Subjects", entry.Properties[ADAttributes.DistinguishedName].Value.ToString()); ExecuteShellCommand(runspace, cmd); cmd = new Command("Set-ADGroup"); - cmd.Parameters.Add("Identity", entry.Properties[ADAttributes.SAMAccountName].Value.ToString()); + cmd.Parameters.Add("Identity", entry.Properties[ADAttributes.DistinguishedName].Value.ToString()); cmd.Parameters.Add("GroupScope", "Global"); ExecuteShellCommand(runspace, cmd); diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/AccountController.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/AccountController.cs index b63a7e2d..5d383a1b 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/AccountController.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/AccountController.cs @@ -267,15 +267,21 @@ namespace WebsitePanel.WebDavPortal.Controllers return result; } + var tokenEntity = WspContext.Services.Organizations.GetPasswordresetAccessToken(token); + var account = WspContext.Services.Organizations.GetUserGeneralSettings(tokenEntity.ItemId, + tokenEntity.AccountId); - var model = new PasswordEditor(); + var model = new PasswordResetFinalStepModel(); + + model.PasswordEditor.Settings = WspContext.Services.Organizations.GetOrganizationPasswordSettings(tokenEntity.ItemId); + model.Login = account.UserPrincipalName; return View(model); } [HttpPost] [AllowAnonymous] - public ActionResult PasswordResetFinalStep(Guid token, string pincode, PasswordEditor model) + public ActionResult PasswordResetFinalStep(Guid token, string pincode, PasswordResetFinalStepModel model) { if (!ModelState.IsValid) { @@ -293,12 +299,10 @@ namespace WebsitePanel.WebDavPortal.Controllers WspContext.Services.Organizations.SetUserPassword( tokenEntity.ItemId, tokenEntity.AccountId, - model.NewPassword); + model.PasswordEditor.NewPassword); WspContext.Services.Organizations.DeletePasswordresetAccessToken(token); - AddMessage(MessageType.Success, Resources.Messages.PasswordSuccessfullyChanged); - return RedirectToRoute(AccountRouteNames.PasswordResetSuccess); } diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Account/PasswordResetFinalStepModel.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Account/PasswordResetFinalStepModel.cs new file mode 100644 index 00000000..4bb82f03 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/Account/PasswordResetFinalStepModel.cs @@ -0,0 +1,15 @@ +using WebsitePanel.WebDavPortal.Models.Common.EditorTemplates; + +namespace WebsitePanel.WebDavPortal.Models.Account +{ + public class PasswordResetFinalStepModel + { + public PasswordResetFinalStepModel() + { + PasswordEditor = new PasswordEditor(); + } + + public string Login { get; set; } + public PasswordEditor PasswordEditor { get; set; } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.Designer.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.Designer.cs index 4fc8c9ae..0df331bf 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.Designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.Designer.cs @@ -654,6 +654,15 @@ namespace WebsitePanel.WebDavPortal.Resources { } } + /// + /// Looks up a localized string similar to Password must meet the following requirements:. + /// + public static string PasswordFollowingRequirements { + get { + return ResourceManager.GetString("PasswordFollowingRequirements", resourceCulture); + } + } + /// /// Looks up a localized string similar to Password never expires. If you want to change password then please click {0}.. /// @@ -915,6 +924,15 @@ namespace WebsitePanel.WebDavPortal.Resources { } } + /// + /// Looks up a localized string similar to You are changing password for '{0}' account.. + /// + public static string YouRChangingPswForFormat { + get { + return ResourceManager.GetString("YouRChangingPswForFormat", resourceCulture); + } + } + /// /// Looks up a localized string similar to Zip/Postal Code. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.resx b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.resx index 508f4a2d..ca01221f 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.resx @@ -405,4 +405,10 @@ Your new password has been set. + + Password must meet the following requirements: + + + You are changing password for '{0}' account. + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/Account/PasswordResetFinalStep.cshtml b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/Account/PasswordResetFinalStep.cshtml index 11fbfbfc..6432a19b 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/Account/PasswordResetFinalStep.cshtml +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/Account/PasswordResetFinalStep.cshtml @@ -1,9 +1,9 @@ -@{ +@using WebsitePanel.WebDavPortal.Resources +@using WebsitePanel.WebDavPortal.UI.Routes +@model WebsitePanel.WebDavPortal.Models.Account.PasswordResetFinalStepModel +@{ Layout = "~/Views/Shared/_Layout.cshtml"; } -@using WebsitePanel.WebDavPortal.Resources -@using WebsitePanel.WebDavPortal.UI.Routes -@model WebsitePanel.WebDavPortal.Models.Common.EditorTemplates.PasswordEditor
@using (Html.BeginRouteForm(AccountRouteNames.PasswordResetFinalStep, FormMethod.Post, new { @class = "form-horizontal user-password-reset-final-step bs-val-styles col-lg-9 col-lg-offset-3", id = "user-password-reset" })) @@ -12,8 +12,14 @@

@UI.PasswordReset

+ +
+ + @string.Format(UI.YouRChangingPswForFormat, Model.Login) + +
- @Html.EditorFor(x=>x) + @Html.EditorFor(x => x.PasswordEditor)
@@ -23,5 +29,64 @@ }
+@if (Model.PasswordEditor.Settings != null) +{ + +} + +@section scripts{ + +} + + diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/Shared/EditorTemplates/PasswordEditor.cshtml b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/Shared/EditorTemplates/PasswordEditor.cshtml index d285f042..45fc478b 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/Shared/EditorTemplates/PasswordEditor.cshtml +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/Shared/EditorTemplates/PasswordEditor.cshtml @@ -8,7 +8,7 @@
- @Html.PasswordFor(x => x.NewPassword, new { @class = "form-control", placeholder = UI.NewPassword, maxlength }) + @Html.PasswordFor(x => x.NewPassword, new { @class = "form-control password-input", placeholder = UI.NewPassword, maxlength }) @Html.Raw(HttpUtility.HtmlDecode(Html.ValidationMessageFor(m => m.NewPassword).ToHtmlString()))
@@ -16,7 +16,7 @@
- @Html.PasswordFor(x => x.NewPasswordConfirmation, new { @class = "form-control", placeholder = UI.NewPasswordConfirmation, maxlength }) + @Html.PasswordFor(x => x.NewPasswordConfirmation, new { @class = "form-control" , placeholder = UI.NewPasswordConfirmation, maxlength }) @Html.ValidationMessageFor(x => x.NewPasswordConfirmation)
diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebsitePanel.WebDavPortal.csproj b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebsitePanel.WebDavPortal.csproj index 62be767a..f8d0894a 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebsitePanel.WebDavPortal.csproj +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/WebsitePanel.WebDavPortal.csproj @@ -198,6 +198,7 @@ + @@ -510,6 +511,7 @@ PublicResXFileCodeGenerator Messages.Designer.cs + Designer PublicResXFileCodeGenerator diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/SystemSettings.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/SystemSettings.ascx.resx index 050f293a..0df8b577 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/SystemSettings.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/SystemSettings.ascx.resx @@ -192,4 +192,7 @@ Twilio + + Password Reset Link Life Span (hours): + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUserResetPassword.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUserResetPassword.ascx.resx index f9dc009b..a21310ff 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUserResetPassword.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUserResetPassword.ascx.resx @@ -120,6 +120,9 @@ Send Password Reset Email + + Don't save as user mobile + Email: diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserResetPassword.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserResetPassword.ascx index b4b70839..f1e7870a 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserResetPassword.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserResetPassword.ascx @@ -45,6 +45,7 @@ + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserResetPassword.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserResetPassword.ascx.cs index 8b5a315d..7fea70e6 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserResetPassword.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserResetPassword.ascx.cs @@ -39,11 +39,13 @@ namespace WebsitePanel.Portal.ExchangeServer if (rbtnEmail.Checked) { - ES.Services.Organizations.SendResetUserPasswordEmail(PanelRequest.ItemID,PanelRequest.AccountID, txtReason.Text, txtEmailAddress.Text, true); + ES.Services.Organizations.SendResetUserPasswordEmail(PanelRequest.ItemID, PanelRequest.AccountID, + txtReason.Text, txtEmailAddress.Text, true); } else { - var result = ES.Services.Organizations.SendResetUserPasswordLinkSms(PanelRequest.ItemID, PanelRequest.AccountID, txtReason.Text, txtMobile.Text); + var result = ES.Services.Organizations.SendResetUserPasswordLinkSms(PanelRequest.ItemID, + PanelRequest.AccountID, txtReason.Text, txtMobile.Text); if (!result.IsSuccess) { @@ -51,6 +53,49 @@ namespace WebsitePanel.Portal.ExchangeServer return; } + + if (chkDontSaveAsMobile.Checked == false) + { + OrganizationUser user = ES.Services.Organizations.GetUserGeneralSettings(PanelRequest.ItemID, + PanelRequest.AccountID); + + ES.Services.Organizations.SetUserGeneralSettings( + PanelRequest.ItemID, PanelRequest.AccountID, + user.DisplayName, + string.Empty, + false, + user.Disabled, + user.Locked, + + user.FirstName, + user.Initials, + user.LastName, + + user.Address, + user.City, + user.State, + user.Zip, + user.Country, + + user.JobTitle, + user.Company, + user.Department, + user.Office, + user.Manager == null ? null : user.Manager.AccountName, + + user.BusinessPhone, + user.Fax, + user.HomePhone, + txtMobile.Text, + user.Pager, + user.WebPage, + user.Notes, + user.ExternalEmail, + user.SubscriberNumber, + user.LevelId, + user.IsVIP, + user.UserMustChangePassword); + } } Response.Redirect(PortalUtils.EditUrl("ItemID", PanelRequest.ItemID.ToString(), diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserResetPassword.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserResetPassword.ascx.designer.cs index 7c1339cb..f0d3eba0 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserResetPassword.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserResetPassword.ascx.designer.cs @@ -147,6 +147,15 @@ namespace WebsitePanel.Portal.ExchangeServer { /// protected global::System.Web.UI.WebControls.TextBox txtMobile; + /// + /// chkDontSaveAsMobile control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkDontSaveAsMobile; + /// /// valMobile control. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SystemSettings.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SystemSettings.ascx index 83198973..d39e917c 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SystemSettings.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SystemSettings.ascx @@ -92,10 +92,15 @@ + + + + + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SystemSettings.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SystemSettings.ascx.cs index c0f9586a..90aeee79 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SystemSettings.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SystemSettings.ascx.cs @@ -166,6 +166,7 @@ namespace WebsitePanel.Portal { chkEnablePasswordReset.Checked = Utils.ParseBool(settings[WSP.SystemSettings.WEBDAV_PASSWORD_RESET_ENABLED_KEY], false); txtWebdavPortalUrl.Text = settings[WEBDAV_PORTAL_URL]; + txtPasswordResetLinkLifeSpan.Text = settings[WSP.SystemSettings.WEBDAV_PASSWORD_RESET_LINK_LIFE_SPAN]; } // Twilio portal @@ -262,6 +263,7 @@ namespace WebsitePanel.Portal settings = new WSP.SystemSettings(); settings[WEBDAV_PORTAL_URL] = txtWebdavPortalUrl.Text; settings[WSP.SystemSettings.WEBDAV_PASSWORD_RESET_ENABLED_KEY] = chkEnablePasswordReset.Checked.ToString(); + settings[WSP.SystemSettings.WEBDAV_PASSWORD_RESET_LINK_LIFE_SPAN] = txtPasswordResetLinkLifeSpan.Text; result = ES.Services.System.SetSystemSettings(WSP.SystemSettings.WEBDAV_PORTAL_SETTINGS, settings); if (result < 0) diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SystemSettings.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SystemSettings.ascx.designer.cs index ea97810e..a027a548 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SystemSettings.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SystemSettings.ascx.designer.cs @@ -264,6 +264,24 @@ namespace WebsitePanel.Portal { /// protected global::System.Web.UI.WebControls.CheckBox chkEnablePasswordReset; + /// + /// lblPasswordResetLinkLifeSpan control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize lblPasswordResetLinkLifeSpan; + + /// + /// txtPasswordResetLinkLifeSpan control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtPasswordResetLinkLifeSpan; + /// /// lblWebdavPortalUrl control. ///