2 // System.Web.UI.WebControls.Login class
5 // Sebastien Pouliot <sebastien@ximian.com>
6 // Konstantin Triger <kostat@mainsoft.com>
8 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 using System.Collections;
33 using System.Globalization;
34 using System.ComponentModel;
35 using System.Security.Permissions;
36 using System.Web.Security;
38 namespace System.Web.UI.WebControls {
41 [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
42 [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
45 [DefaultEvent ("Authenticate")]
46 [Designer ("System.Web.UI.Design.WebControls.LoginDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
47 public class Login : CompositeControl {
49 #region LoginContainer
51 sealed class LoginContainer : WebControl {
52 public Control UserNameTextBox {
54 return FindControl("UserName");
58 public Control PasswordTextBox {
60 return FindControl("Password");
64 public Control RememberMeCheckBox {
66 return FindControl("RememberMe");
75 sealed class LoginTemplate : WebControl, ITemplate {
76 readonly Login _login;
78 private TextBox userNameTextBox;
79 private RequiredFieldValidator userNameRequired;
80 private TextBox passwordTextBox;
81 private RequiredFieldValidator passwordRequired;
82 private CheckBox rememberMeCheckBox;
83 private WebControl loginButton;
85 public LoginTemplate (Login login)
90 void ITemplate.InstantiateIn(Control container) {
91 container.Controls.Add (this);
93 userNameTextBox = new TextBox ();
94 userNameTextBox.ID = "UserName";
96 userNameRequired = new RequiredFieldValidator ();
97 userNameRequired.ID = "UserNameRequired";
98 userNameRequired.ControlToValidate = userNameTextBox.ID;
99 userNameRequired.ErrorMessage = "*";
100 userNameRequired.ValidationGroup = this.UniqueID;
102 passwordTextBox = new TextBox ();
103 passwordTextBox.ID = "Password";
104 passwordTextBox.TextMode = TextBoxMode.Password;
106 passwordRequired = new RequiredFieldValidator ();
107 passwordRequired.ID = "PasswordRequired";
108 passwordRequired.ControlToValidate = passwordTextBox.ID;
109 passwordRequired.ErrorMessage = "*";
110 passwordRequired.ValidationGroup = this.UniqueID;
112 rememberMeCheckBox = new CheckBox ();
113 rememberMeCheckBox.ID = "RememberMe";
114 rememberMeCheckBox.Checked = _login.RememberMeSet;
116 switch (_login.LoginButtonType) {
117 case ButtonType.Button:
118 loginButton = new Button ();
119 loginButton.ID = "LoginButton";
121 case ButtonType.Link:
122 loginButton = new LinkButton ();
123 loginButton.ID = "LoginLinkButton";
125 case ButtonType.Image:
126 loginButton = new ImageButton ();
127 loginButton.ID = "LoginImageButton";
130 IButtonControl control = (loginButton as IButtonControl);
131 control.Text = _login.LoginButtonText;
132 control.CommandName = Login.LoginButtonCommandName;
133 control.Command += new CommandEventHandler (_login.LoginClick);
134 control.ValidationGroup = this.UniqueID;
136 // adds them all at the end (after setting their properties)
137 Controls.Add (userNameTextBox);
138 Controls.Add (userNameRequired);
139 Controls.Add (passwordTextBox);
140 Controls.Add (passwordRequired);
141 Controls.Add (rememberMeCheckBox);
142 Controls.Add (loginButton);
145 [MonoTODO ("render error messages")]
146 [MonoTODO ("set child control properties in ITemplate.InstantiateIn and let them render themself")]
147 protected internal override void Render(HtmlTextWriter writer) {
148 userNameRequired.ToolTip = _login.UserNameRequiredErrorMessage;
149 passwordRequired.ToolTip = _login.PasswordRequiredErrorMessage;
151 bool vertical = (_login.Orientation == Orientation.Vertical);
152 bool textontop = (_login.TextLayout == LoginTextLayout.TextOnTop);
153 string colspan = vertical ? (textontop ? String.Empty : "2") : (textontop ? "4" : "6");
154 string align = (textontop ? "left" : "right");
157 writer.AddAttribute (HtmlTextWriterAttribute.Cellpadding, "0");
158 writer.AddAttribute (HtmlTextWriterAttribute.Border, "0");
159 writer.RenderBeginTag (HtmlTextWriterTag.Table);
162 // for both Orientation.Vertical and Orientation.Horizontal
164 writer.RenderBeginTag (HtmlTextWriterTag.Tr);
165 writer.AddAttribute (HtmlTextWriterAttribute.Align, "center");
166 if (colspan.Length > 0)
167 writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan);
168 if (!_login.IsEmpty (_login.titleTextStyle))
169 _login.titleTextStyle.AddAttributesToRender (writer);
170 writer.RenderBeginTag (HtmlTextWriterTag.Td);
171 writer.Write (_login.TitleText);
172 writer.RenderEndTag ();
173 writer.RenderEndTag ();
175 // Second row - Instructions (optional)
176 // for both Orientation.Vertical and Orientation.Horizontal
178 string instructions = _login.InstructionText;
179 if (instructions.Length > 0) {
180 writer.RenderBeginTag (HtmlTextWriterTag.Tr);
181 writer.AddAttribute (HtmlTextWriterAttribute.Align, "center");
182 if (colspan.Length > 0)
183 writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan);
184 if (!_login.IsEmpty (_login.instructionTextStyle))
185 _login.instructionTextStyle.AddAttributesToRender (writer);
186 writer.RenderBeginTag (HtmlTextWriterTag.Td);
187 writer.Write (instructions);
188 writer.RenderEndTag ();
189 writer.RenderEndTag ();
193 // - Orientation.Vertical == Username
194 // - Orientation.Horizontal == Username, Password, RememberMe and LogIn button
196 if (!vertical && textontop) {
197 RenderUserNameTextBox (writer);
198 RenderPasswordTextBox (writer);
201 writer.RenderBeginTag (HtmlTextWriterTag.Tr);
203 writer.AddAttribute (HtmlTextWriterAttribute.Align, align);
204 RenderUserNameTextBox (writer);
205 } else if (!textontop) {
206 RenderUserNameTextBox (writer);
208 if (vertical && textontop) {
209 writer.RenderEndTag ();
210 writer.RenderBeginTag (HtmlTextWriterTag.Tr);
212 writer.RenderBeginTag (HtmlTextWriterTag.Td);
213 if (!_login.IsEmpty (_login.textBoxStyle))
214 _login.textBoxStyle.AddAttributesToRender (writer);
215 userNameTextBox.RenderControl (writer);
216 userNameRequired.RenderControl (writer);
217 writer.RenderEndTag ();
219 writer.RenderEndTag ();
222 writer.RenderBeginTag (HtmlTextWriterTag.Tr);
223 writer.AddAttribute (HtmlTextWriterAttribute.Align, align);
224 RenderPasswordTextBox (writer);
225 } else if (!textontop) {
226 RenderPasswordTextBox (writer);
228 if (vertical && textontop) {
229 writer.RenderEndTag ();
230 writer.RenderBeginTag (HtmlTextWriterTag.Tr);
232 writer.RenderBeginTag (HtmlTextWriterTag.Td);
233 if (!_login.IsEmpty (_login.textBoxStyle))
234 _login.textBoxStyle.AddAttributesToRender (writer);
235 passwordTextBox.RenderControl (writer);
236 passwordRequired.RenderControl (writer);
237 writer.RenderEndTag ();
239 writer.RenderEndTag ();
241 if (_login.DisplayRememberMe) {
243 writer.RenderBeginTag (HtmlTextWriterTag.Tr);
244 if (colspan.Length > 0)
245 writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan);
247 writer.RenderBeginTag (HtmlTextWriterTag.Td);
248 rememberMeCheckBox.RenderControl (writer);
249 writer.AddAttribute (HtmlTextWriterAttribute.For, rememberMeCheckBox.ClientID);
250 writer.RenderBeginTag (HtmlTextWriterTag.Label);
251 writer.Write (_login.RememberMeText);
252 writer.RenderEndTag ();
253 writer.RenderEndTag ();
255 writer.RenderEndTag ();
258 // TODO - detect failure
262 writer.RenderBeginTag (HtmlTextWriterTag.Tr);
263 if (colspan.Length > 0)
264 writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan);
265 writer.AddAttribute (HtmlTextWriterAttribute.Align, "center");
266 writer.AddStyleAttribute (HtmlTextWriterStyle.Color, "red");
267 if (!_login.IsEmpty (_login.failureTextStyle)) {
268 _login.failureTextStyle.AddAttributesToRender (writer);
270 writer.Write (_login.FailureText);
271 writer.RenderEndTag ();
273 writer.RenderEndTag ();
278 writer.RenderBeginTag (HtmlTextWriterTag.Tr);
279 writer.AddAttribute (HtmlTextWriterAttribute.Align, "right");
280 if (colspan.Length > 0)
281 writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan);
283 writer.RenderBeginTag (HtmlTextWriterTag.Td);
284 if (!_login.IsEmpty (_login.logonButtonStyle)) {
285 _login.logonButtonStyle.AddAttributesToRender (writer);
287 if (loginButton is ImageButton) {
288 (loginButton as ImageButton).ImageUrl = _login.LoginButtonImageUrl;
290 loginButton.RenderControl (writer);
291 writer.RenderEndTag ();
292 writer.RenderEndTag ();
294 bool userText = (_login.CreateUserText.Length > 0);
295 bool userImg = (_login.CreateUserIconUrl.Length > 0);
296 bool passText = (_login.PasswordRecoveryText.Length > 0);
297 bool passImg = (_login.PasswordRecoveryIconUrl.Length > 0);
298 bool helpText = (_login.HelpPageText.Length > 0);
299 bool helpImg = (_login.HelpPageIconUrl.Length > 0);
300 // show row if CreateUserText or CreateUserIconUrl is set
301 // but not if only CreateUserUrl is set
302 if (userText || userImg || passText || passImg || helpText || helpImg) {
303 writer.RenderBeginTag (HtmlTextWriterTag.Tr);
304 if (colspan.Length > 0)
305 writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan);
306 writer.RenderBeginTag (HtmlTextWriterTag.Td);
309 writer.AddAttribute (HtmlTextWriterAttribute.Src, _login.CreateUserIconUrl);
310 writer.AddStyleAttribute (HtmlTextWriterStyle.BorderWidth, "0px");
312 writer.AddAttribute (HtmlTextWriterAttribute.Alt, _login.CreateUserText);
313 writer.RenderBeginTag (HtmlTextWriterTag.Img);
314 writer.RenderEndTag ();
318 string href = _login.CreateUserUrl;
320 writer.AddAttribute (HtmlTextWriterAttribute.Href, href);
321 if (_login.hyperLinkStyle != null)
322 _login.hyperLinkStyle.AddAttributesToRender (writer);
323 writer.RenderBeginTag (HtmlTextWriterTag.A);
324 writer.Write (_login.CreateUserText);
325 writer.RenderEndTag ();
328 if (passText || passImg) {
329 if (userImg || userText) {
331 writer.Write ("<br />");
338 writer.AddAttribute (HtmlTextWriterAttribute.Src, _login.PasswordRecoveryIconUrl);
339 writer.AddStyleAttribute (HtmlTextWriterStyle.BorderWidth, "0px");
341 writer.AddAttribute (HtmlTextWriterAttribute.Alt, _login.PasswordRecoveryText);
342 writer.RenderBeginTag (HtmlTextWriterTag.Img);
343 writer.RenderEndTag ();
347 string href = _login.PasswordRecoveryUrl;
349 writer.AddAttribute (HtmlTextWriterAttribute.Href, href);
350 if (_login.hyperLinkStyle != null)
351 _login.hyperLinkStyle.AddAttributesToRender (writer);
352 writer.RenderBeginTag (HtmlTextWriterTag.A);
353 writer.Write (_login.PasswordRecoveryText);
354 writer.RenderEndTag ();
358 if (helpText || helpImg) {
359 if (userImg || userText || passText || passImg) {
361 writer.Write ("<br />");
368 writer.AddAttribute (HtmlTextWriterAttribute.Src, _login.HelpPageIconUrl);
369 writer.AddStyleAttribute (HtmlTextWriterStyle.BorderWidth, "0px");
371 writer.AddAttribute (HtmlTextWriterAttribute.Alt, _login.HelpPageText);
372 writer.RenderBeginTag (HtmlTextWriterTag.Img);
373 writer.RenderEndTag ();
377 string href = _login.HelpPageUrl;
379 writer.AddAttribute (HtmlTextWriterAttribute.Href, href);
380 if (_login.hyperLinkStyle != null)
381 _login.hyperLinkStyle.AddAttributesToRender (writer);
382 writer.RenderBeginTag (HtmlTextWriterTag.A);
383 writer.Write (_login.HelpPageText);
384 writer.RenderEndTag ();
388 writer.RenderEndTag ();
389 writer.RenderEndTag ();
393 writer.RenderEndTag (); // Table
396 private void RenderUserNameTextBox (HtmlTextWriter writer) {
397 writer.RenderBeginTag (HtmlTextWriterTag.Td);
398 writer.AddAttribute (HtmlTextWriterAttribute.For, userNameTextBox.ClientID);
399 writer.RenderBeginTag (HtmlTextWriterTag.Label);
400 writer.Write (_login.UserNameLabelText);
401 writer.RenderEndTag ();
402 writer.RenderEndTag ();
405 private void RenderPasswordTextBox (HtmlTextWriter writer) {
406 writer.RenderBeginTag (HtmlTextWriterTag.Td);
407 writer.AddAttribute (HtmlTextWriterAttribute.For, passwordTextBox.ClientID);
408 writer.RenderBeginTag (HtmlTextWriterTag.Label);
409 writer.Write (_login.PasswordLabelText);
410 writer.RenderEndTag ();
411 writer.RenderEndTag ();
417 public static readonly string LoginButtonCommandName = "Login";
419 private static readonly object authenticateEvent = new object ();
420 private static readonly object loggedInEvent = new object ();
421 private static readonly object loggingInEvent = new object ();
422 private static readonly object loginErrorEvent = new object ();
424 private TableItemStyle checkBoxStyle;
425 private TableItemStyle failureTextStyle;
426 private TableItemStyle hyperLinkStyle;
427 private TableItemStyle instructionTextStyle;
428 private TableItemStyle labelStyle;
429 private Style logonButtonStyle;
430 private Style textBoxStyle;
431 private TableItemStyle titleTextStyle;
432 private Style validatorTextStyle;
434 private ITemplate layoutTemplate;
436 private string _password;
445 public virtual int BorderPadding {
447 object o = ViewState ["BorderPadding"];
448 return (o == null) ? 1 : (int) o;
452 throw new ArgumentOutOfRangeException ("BorderPadding", "< -1");
454 ViewState ["BorderPadding"] = value;
458 [DefaultValue (null)]
459 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
460 [NotifyParentProperty (true)]
461 [PersistenceMode (PersistenceMode.InnerProperty)]
462 public TableItemStyle CheckBoxStyle {
464 if (checkBoxStyle == null) {
465 checkBoxStyle = new TableItemStyle ();
466 if (IsTrackingViewState) {
467 (checkBoxStyle as IStateManager).TrackViewState ();
470 return checkBoxStyle;
475 [Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
477 public virtual string CreateUserIconUrl {
479 object o = ViewState ["CreateUserIconUrl"];
480 return (o == null) ? String.Empty : (string) o;
484 ViewState.Remove ("CreateUserIconUrl");
486 ViewState ["CreateUserIconUrl"] = value;
492 public virtual string CreateUserText {
494 object o = ViewState ["CreateUserText"];
495 return (o == null) ? String.Empty : (string) o;
499 ViewState.Remove ("CreateUserText");
501 ViewState ["CreateUserText"] = value;
506 [Editor ("System.Web.UI.Design.UrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
508 public virtual string CreateUserUrl {
510 object o = ViewState ["CreateUserUrl"];
511 return (o == null) ? String.Empty : (string) o;
515 ViewState.Remove ("CreateUserUrl");
517 ViewState ["CreateUserUrl"] = value;
522 [Editor ("System.Web.UI.Design.UrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
525 public virtual string DestinationPageUrl {
527 object o = ViewState ["DestinationPageUrl"];
528 return (o == null) ? String.Empty : (string) o;
532 ViewState.Remove ("DestinationPageUrl");
534 ViewState ["DestinationPageUrl"] = value;
538 [DefaultValue (true)]
540 public virtual bool DisplayRememberMe {
542 object o = ViewState ["DisplayRememberMe"];
543 return (o == null) ? true : (bool) o;
546 ViewState ["DisplayRememberMe"] = value;
550 [DefaultValue (LoginFailureAction.Refresh)]
552 [MonoTODO ("RedirectToLoginPage not yet implemented in FormsAuthentication")]
553 public virtual LoginFailureAction FailureAction {
555 object o = ViewState ["FailureAction"];
556 return (o == null) ? LoginFailureAction.Refresh : (LoginFailureAction) o;
559 if ((value < LoginFailureAction.Refresh) || (value > LoginFailureAction.RedirectToLoginPage))
560 throw new ArgumentOutOfRangeException ("FailureAction");
561 ViewState ["FailureAction"] = (int) value;
566 public virtual string FailureText {
568 object o = ViewState ["FailureText"];
569 return (o == null) ? Locale.GetText ("Your login attempt was not successful. Please try again.") : (string) o;
573 ViewState.Remove ("FailureText");
575 ViewState ["FailureText"] = value;
579 [DefaultValue (null)]
580 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
581 [NotifyParentProperty (true)]
582 [PersistenceMode (PersistenceMode.InnerProperty)]
583 public TableItemStyle FailureTextStyle {
585 if (failureTextStyle == null) {
586 failureTextStyle = new TableItemStyle ();
587 if (IsTrackingViewState) {
588 (failureTextStyle as IStateManager).TrackViewState ();
591 return failureTextStyle;
596 [Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
598 public virtual string HelpPageIconUrl {
600 object o = ViewState ["HelpPageIconUrl"];
601 return (o == null) ? String.Empty : (string) o;
605 ViewState.Remove ("HelpPageIconUrl");
607 ViewState ["HelpPageIconUrl"] = value;
613 public virtual string HelpPageText {
615 object o = ViewState ["HelpPageText"];
616 return (o == null) ? String.Empty : (string) o;
620 ViewState.Remove ("HelpPageText");
622 ViewState ["HelpPageText"] = value;
627 [Editor ("System.Web.UI.Design.UrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
629 public virtual string HelpPageUrl {
631 object o = ViewState ["HelpPageUrl"];
632 return (o == null) ? String.Empty : (string) o;
636 ViewState.Remove ("HelpPageUrl");
638 ViewState ["HelpPageUrl"] = value;
642 [DefaultValue (null)]
643 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
644 [NotifyParentProperty (true)]
645 [PersistenceMode (PersistenceMode.InnerProperty)]
646 public TableItemStyle HyperLinkStyle {
648 if (hyperLinkStyle == null) {
649 hyperLinkStyle = new TableItemStyle ();
650 if (IsTrackingViewState) {
651 (hyperLinkStyle as IStateManager).TrackViewState ();
654 return hyperLinkStyle;
660 public virtual string InstructionText {
662 object o = ViewState ["InstructionText"];
663 return (o == null) ? String.Empty : (string) o;
667 ViewState.Remove ("InstructionText");
669 ViewState ["InstructionText"] = value;
673 [DefaultValue (null)]
674 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
675 [NotifyParentProperty (true)]
676 [PersistenceMode (PersistenceMode.InnerProperty)]
677 public TableItemStyle InstructionTextStyle {
679 if (instructionTextStyle == null) {
680 instructionTextStyle = new TableItemStyle ();
681 if (IsTrackingViewState) {
682 (instructionTextStyle as IStateManager).TrackViewState ();
685 return instructionTextStyle;
689 [DefaultValue (null)]
690 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
691 [NotifyParentProperty (true)]
692 [PersistenceMode (PersistenceMode.InnerProperty)]
693 public TableItemStyle LabelStyle {
695 if (labelStyle == null) {
696 labelStyle = new TableItemStyle ();
697 if (IsTrackingViewState) {
698 (labelStyle as IStateManager).TrackViewState ();
706 [TemplateContainer (typeof (Login))]
707 [PersistenceMode (PersistenceMode.InnerProperty)]
708 public virtual ITemplate LayoutTemplate {
709 get { return layoutTemplate; }
710 set { layoutTemplate = value; }
714 [Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
716 public virtual string LoginButtonImageUrl {
718 object o = ViewState ["LoginButtonImageUrl"];
719 return (o == null) ? String.Empty : (string) o;
723 ViewState.Remove ("LoginButtonImageUrl");
725 ViewState ["LoginButtonImageUrl"] = value;
729 [DefaultValue (null)]
730 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
731 [NotifyParentProperty (true)]
732 [PersistenceMode (PersistenceMode.InnerProperty)]
733 public Style LoginButtonStyle {
735 if (logonButtonStyle == null) {
736 logonButtonStyle = new Style ();
737 if (IsTrackingViewState) {
738 (logonButtonStyle as IStateManager).TrackViewState ();
741 return logonButtonStyle;
746 public virtual string LoginButtonText {
748 object o = ViewState ["LoginButtonText"];
749 return (o == null) ? Locale.GetText ("Log In") : (string) o;
753 ViewState.Remove ("LoginButtonText");
755 ViewState ["LoginButtonText"] = value;
759 [DefaultValue (ButtonType.Button)]
760 public virtual ButtonType LoginButtonType {
762 object o = ViewState ["LoginButtonType"];
763 return (o == null) ? ButtonType.Button : (ButtonType) o;
766 if ((value < ButtonType.Button) || (value > ButtonType.Link))
767 throw new ArgumentOutOfRangeException ("LoginButtonType");
768 ViewState ["LoginButtonType"] = (int) value;
774 public virtual string MembershipProvider {
776 object o = ViewState ["MembershipProvider"];
777 return (o == null) ? String.Empty : (string) o;
781 ViewState.Remove ("MembershipProvider");
783 ViewState ["MembershipProvider"] = value;
787 [DefaultValue (Orientation.Vertical)]
788 public virtual Orientation Orientation {
790 object o = ViewState ["Orientation"];
791 return (o == null) ? Orientation.Vertical : (Orientation) o;
794 if ((value < Orientation.Horizontal) || (value > Orientation.Vertical))
795 throw new ArgumentOutOfRangeException ("Orientation");
796 ViewState ["Orientation"] = (int) value;
801 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
802 public virtual string Password {
804 return _password != null ? _password : String.Empty;
809 public virtual string PasswordLabelText {
811 object o = ViewState ["PasswordLabelText"];
812 return (o == null) ? "Password:" : (string) o;
816 ViewState.Remove ("PasswordLabelText");
818 ViewState ["PasswordLabelText"] = value;
823 [Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
825 public virtual string PasswordRecoveryIconUrl {
827 object o = ViewState ["PasswordRecoveryIconUrl"];
828 return (o == null) ? String.Empty : (string) o;
832 ViewState.Remove ("PasswordRecoveryIconUrl");
834 ViewState ["PasswordRecoveryIconUrl"] = value;
840 public virtual string PasswordRecoveryText {
842 object o = ViewState ["PasswordRecoveryText"];
843 return (o == null) ? String.Empty : (string) o;
847 ViewState.Remove ("PasswordRecoveryText");
849 ViewState ["PasswordRecoveryText"] = value;
854 [Editor ("System.Web.UI.Design.UrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
856 public virtual string PasswordRecoveryUrl {
858 object o = ViewState ["PasswordRecoveryUrl"];
859 return (o == null) ? String.Empty : (string) o;
863 ViewState.Remove ("PasswordRecoveryUrl");
865 ViewState ["PasswordRecoveryUrl"] = value;
870 public virtual string PasswordRequiredErrorMessage {
872 object o = ViewState ["PasswordRequiredErrorMessage"];
873 return (o == null) ? Locale.GetText ("Password is required.") : (string) o;
877 ViewState.Remove ("PasswordRequiredErrorMessage");
879 ViewState ["PasswordRequiredErrorMessage"] = value;
883 [DefaultValue (false)]
885 public virtual bool RememberMeSet {
887 object o = ViewState ["RememberMeSet"];
888 return (o == null) ? false : (bool) o;
891 ViewState ["RememberMeSet"] = value;
896 public virtual string RememberMeText {
898 object o = ViewState ["RememberMeText"];
899 return (o == null) ? Locale.GetText ("Remember me next time.") : (string) o;
903 ViewState.Remove ("RememberMeText");
905 ViewState ["RememberMeText"] = value;
909 protected override HtmlTextWriterTag TagKey {
910 get { return HtmlTextWriterTag.Table; }
913 [DefaultValue (null)]
914 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
915 [NotifyParentProperty (true)]
916 [PersistenceMode (PersistenceMode.InnerProperty)]
917 public Style TextBoxStyle {
919 if (textBoxStyle == null) {
920 textBoxStyle = new Style ();
921 if (IsTrackingViewState) {
922 (textBoxStyle as IStateManager).TrackViewState ();
929 [DefaultValue (LoginTextLayout.TextOnLeft)]
930 public virtual LoginTextLayout TextLayout {
932 object o = ViewState ["TextLayout"];
933 return (o == null) ? LoginTextLayout.TextOnLeft : (LoginTextLayout) o;
936 if ((value < LoginTextLayout.TextOnLeft) || (value > LoginTextLayout.TextOnTop))
937 throw new ArgumentOutOfRangeException ("TextLayout");
938 ViewState ["TextLayout"] = (int) value;
943 public virtual string TitleText {
945 object o = ViewState ["TitleText"];
946 return (o == null) ? Locale.GetText ("Log In") : (string) o;
950 ViewState.Remove ("TitleText");
952 ViewState ["TitleText"] = value;
956 [DefaultValue (null)]
957 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
958 [NotifyParentProperty (true)]
959 [PersistenceMode (PersistenceMode.InnerProperty)]
960 public TableItemStyle TitleTextStyle {
962 if (titleTextStyle == null) {
963 titleTextStyle = new TableItemStyle ();
964 if (IsTrackingViewState) {
965 (titleTextStyle as IStateManager).TrackViewState ();
968 return titleTextStyle;
973 public virtual string UserName {
975 object o = ViewState ["UserName"];
976 return (o == null) ? String.Empty : (string) o;
980 ViewState.Remove ("UserName");
982 ViewState ["UserName"] = value;
987 public virtual string UserNameLabelText {
989 object o = ViewState ["UserNameLabelText"];
990 return (o == null) ? Locale.GetText ("User Name:") : (string) o;
994 ViewState.Remove ("UserNameLabelText");
996 ViewState ["UserNameLabelText"] = value;
1000 [Localizable (true)]
1001 public virtual string UserNameRequiredErrorMessage {
1003 object o = ViewState ["UserNameRequiredErrorMessage"];
1004 return (o == null) ? Locale.GetText ("User Name is required.") : (string) o;
1008 ViewState.Remove ("UserNameRequiredErrorMessage");
1010 ViewState ["UserNameRequiredErrorMessage"] = value;
1014 [DefaultValue (null)]
1015 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
1016 [NotifyParentProperty (true)]
1017 [PersistenceMode (PersistenceMode.InnerProperty)]
1018 public Style ValidatorTextStyle {
1020 if (validatorTextStyle == null) {
1021 validatorTextStyle = new Style ();
1022 if (IsTrackingViewState) {
1023 (validatorTextStyle as IStateManager).TrackViewState ();
1026 return validatorTextStyle;
1030 [DefaultValue (true)]
1032 public virtual bool VisibleWhenLoggedIn {
1034 object o = ViewState ["VisibleWhenLoggedIn"];
1035 return (o == null) ? true : (bool) o;
1038 ViewState ["VisibleWhenLoggedIn"] = value;
1045 protected internal override void CreateChildControls ()
1049 Table table = new Table ();
1050 table.ID = ClientID;
1051 table.CellSpacing = 0;
1052 table.CellPadding = BorderPadding;
1054 TableRow row = new TableRow ();
1055 table.Rows.Add (row);
1056 TableCell cell = new TableCell ();
1057 row.Cells.Add (cell);
1059 Controls.Add (table);
1061 LoginContainer container = new LoginContainer ();
1062 cell.Controls.Add (container);
1064 ITemplate template = LayoutTemplate;
1065 if (template == null)
1066 template = new LoginTemplate (this);
1068 template.InstantiateIn (container);
1070 IEditableTextControl editable;
1072 editable = container.UserNameTextBox as IEditableTextControl;
1074 if (editable != null)
1075 editable.TextChanged += new EventHandler (UserName_TextChanged);
1077 editable = container.PasswordTextBox as IEditableTextControl;
1079 if (editable != null)
1080 editable.TextChanged += new EventHandler (Password_TextChanged);
1082 ICheckBoxControl checkBox = container.RememberMeCheckBox as ICheckBoxControl;
1084 if (checkBox != null)
1085 checkBox.CheckedChanged += new EventHandler (RememberMe_CheckedChanged);
1089 protected override void LoadViewState (object savedState)
1091 if (savedState == null) {
1092 base.LoadViewState (null);
1096 object[] state = (object[]) savedState;
1097 base.LoadViewState (state [0]);
1098 if (state [1] != null)
1099 (LoginButtonStyle as IStateManager).LoadViewState (state [1]);
1100 if (state [2] != null)
1101 (LabelStyle as IStateManager).LoadViewState (state [2]);
1102 if (state [3] != null)
1103 (TextBoxStyle as IStateManager).LoadViewState (state [3]);
1104 if (state [4] != null)
1105 (HyperLinkStyle as IStateManager).LoadViewState (state [4]);
1106 if (state [5] != null)
1107 (InstructionTextStyle as IStateManager).LoadViewState (state [5]);
1108 if (state [6] != null)
1109 (TitleTextStyle as IStateManager).LoadViewState (state [6]);
1110 if (state [7] != null)
1111 (CheckBoxStyle as IStateManager).LoadViewState (state [7]);
1112 if (state [8] != null)
1113 (FailureTextStyle as IStateManager).LoadViewState (state [8]);
1114 if (state [9] != null)
1115 (ValidatorTextStyle as IStateManager).LoadViewState (state [9]);
1118 protected virtual void OnAuthenticate (AuthenticateEventArgs e)
1120 // this gets called after OnLoggingIn and the authentication so we can change the result
1121 AuthenticateEventHandler authenticate = (AuthenticateEventHandler) Events [authenticateEvent];
1122 if (authenticate != null)
1123 authenticate (this, e);
1126 protected override bool OnBubbleEvent (object source, EventArgs e)
1128 // check for submit button
1129 CommandEventArgs cea = (e as CommandEventArgs);
1130 if ((cea != null) && (cea.CommandName == LoginButtonCommandName)) {
1131 AuthenticateUser ();
1137 protected virtual void OnLoggedIn (EventArgs e)
1139 // this gets called only if the authentication was successful
1140 EventHandler loggedIn = (EventHandler) Events [loggedInEvent];
1141 if (loggedIn != null)
1145 protected virtual void OnLoggingIn (LoginCancelEventArgs e)
1147 // this gets called before OnAuthenticate so we can abort the authentication process
1148 LoginCancelEventHandler loggingIn = (LoginCancelEventHandler) Events [loggedInEvent];
1149 if (loggingIn != null)
1150 loggingIn (this, e);
1153 protected virtual void OnLoginError (EventArgs e)
1155 // this gets called only if the authentication wasn't successful
1156 EventHandler loginError = (EventHandler) Events [loginErrorEvent];
1157 if (loginError != null)
1158 loginError (this, e);
1161 [MonoTODO ("overriden for ?")]
1162 protected internal override void OnPreRender (EventArgs e)
1164 base.OnPreRender (e);
1165 // note: doc says that UserName and Password aren't available at
1166 // PageLoad but are during PreRender phase, so... ???
1169 protected internal override void Render (HtmlTextWriter writer)
1171 // VisibleWhenLoggedIn isn't applicable to the default login page
1172 if (!VisibleWhenLoggedIn && !IsDefaultLoginPage () && IsLoggedIn ())
1176 Page.VerifyRenderingInServerForm (this);
1179 EnsureChildControls ();
1181 RenderContents(writer);
1184 protected override object SaveViewState ()
1186 object[] state = new object [10];
1187 state [0] = base.SaveViewState ();
1188 if (logonButtonStyle != null)
1189 state [1] = (logonButtonStyle as IStateManager).SaveViewState ();
1190 if (labelStyle != null)
1191 state [2] = (labelStyle as IStateManager).SaveViewState ();
1192 if (textBoxStyle != null)
1193 state [3] = (textBoxStyle as IStateManager).SaveViewState ();
1194 if (hyperLinkStyle != null)
1195 state [4] = (hyperLinkStyle as IStateManager).SaveViewState ();
1196 if (instructionTextStyle != null)
1197 state [5] = (instructionTextStyle as IStateManager).SaveViewState ();
1198 if (titleTextStyle != null)
1199 state [6] = (titleTextStyle as IStateManager).SaveViewState ();
1200 if (checkBoxStyle != null)
1201 state [7] = (checkBoxStyle as IStateManager).SaveViewState ();
1202 if (failureTextStyle != null)
1203 state [8] = (failureTextStyle as IStateManager).SaveViewState ();
1204 if (validatorTextStyle != null)
1205 state [9] = (validatorTextStyle as IStateManager).SaveViewState ();
1207 for (int i=0; i < state.Length; i++) {
1208 if (state [0] != null)
1209 return (object) state;
1211 return null; // reduce view state
1214 [MonoTODO ("for design-time usage - no more details available")]
1215 protected override void SetDesignModeState (IDictionary data)
1217 base.SetDesignModeState (data);
1220 protected override void TrackViewState ()
1222 base.TrackViewState ();
1223 if (logonButtonStyle != null)
1224 (logonButtonStyle as IStateManager).TrackViewState ();
1225 if (labelStyle != null)
1226 (labelStyle as IStateManager).TrackViewState ();
1227 if (textBoxStyle != null)
1228 (textBoxStyle as IStateManager).TrackViewState ();
1229 if (hyperLinkStyle != null)
1230 (hyperLinkStyle as IStateManager).TrackViewState ();
1231 if (instructionTextStyle != null)
1232 (instructionTextStyle as IStateManager).TrackViewState ();
1233 if (titleTextStyle != null)
1234 (titleTextStyle as IStateManager).TrackViewState ();
1235 if (checkBoxStyle != null)
1236 (checkBoxStyle as IStateManager).TrackViewState ();
1237 if (failureTextStyle != null)
1238 (failureTextStyle as IStateManager).TrackViewState ();
1239 if (validatorTextStyle != null)
1240 (validatorTextStyle as IStateManager).TrackViewState ();
1246 public event AuthenticateEventHandler Authenticate {
1247 add { Events.AddHandler (authenticateEvent, value); }
1248 remove { Events.RemoveHandler (authenticateEvent, value); }
1251 public event EventHandler LoggedIn {
1252 add { Events.AddHandler (loggedInEvent, value); }
1253 remove { Events.RemoveHandler (loggedInEvent, value); }
1256 public event LoginCancelEventHandler LoggingIn {
1257 add { Events.AddHandler (loggingInEvent, value); }
1258 remove { Events.RemoveHandler (loggingInEvent, value); }
1261 public event EventHandler LoginError {
1262 add { Events.AddHandler (loginErrorEvent, value); }
1263 remove { Events.RemoveHandler (loginErrorEvent, value); }
1269 private bool AuthenticateUser ()
1271 LoginCancelEventArgs lcea = new LoginCancelEventArgs ();
1276 string mp = MembershipProvider;
1277 MembershipProvider provider = (mp.Length == 0) ?
1278 provider = Membership.Provider : Membership.Providers [mp];
1279 if (provider == null) {
1280 throw new HttpException (Locale.GetText ("No provider named '{0}' could be found.", mp));
1283 AuthenticateEventArgs aea = new AuthenticateEventArgs ();
1284 aea.Authenticated = provider.ValidateUser (UserName, Password);
1285 OnAuthenticate (aea);
1287 if (aea.Authenticated) {
1288 string url = DestinationPageUrl;
1289 FormsAuthentication.SetAuthCookie (UserName, RememberMeSet);
1290 if (url.Length == 0) {
1291 Redirect (FormsAuthentication.LoginUrl);
1295 OnLoggedIn (EventArgs.Empty);
1298 OnLoginError (EventArgs.Empty);
1299 if (FailureAction == LoginFailureAction.RedirectToLoginPage) {
1300 // login page is defined in web.config
1301 FormsAuthentication.RedirectToLoginPage ();
1307 private void LoginClick (object sender, CommandEventArgs e)
1309 RaiseBubbleEvent (sender, (EventArgs)e);
1312 private bool IsEmpty (Style style)
1316 return style.IsEmpty;
1319 private bool IsDefaultLoginPage ()
1321 if ((Page == null) || (Page.Request == null))
1323 string url = Page.Request.Url.AbsolutePath;
1324 string defaultLogin = FormsAuthentication.LoginUrl;
1325 return (String.Compare (defaultLogin, 0, url, url.Length - defaultLogin.Length, defaultLogin.Length,
1326 true, CultureInfo.InvariantCulture) == 0);
1329 private bool IsLoggedIn ()
1331 if ((Page == null) || (Page.Request == null))
1333 return Page.Request.IsAuthenticated;
1336 private void Redirect (string url)
1338 if ((Page != null) && (Page.Response != null))
1339 Page.Response.Redirect (url);
1342 private void UserName_TextChanged (object sender, EventArgs e)
1344 UserName = ((ITextControl)sender).Text;
1347 private void Password_TextChanged (object sender, EventArgs e)
1349 _password = ((ITextControl)sender).Text;
1352 private void RememberMe_CheckedChanged (object sender, EventArgs e)
1354 RememberMeSet = ((ICheckBoxControl)sender).Checked;