2008-05-30 Marek Habersack <mhabersack@novell.com>
[mono.git] / mcs / class / System.Web / System.Web.Security / FormsAuthenticationModule.cs
index 70709007d077a56df2013fbc96aeb6133364a24d..fb14b524ed93e45b67601134da50742a43c15421 100644 (file)
@@ -27,6 +27,7 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
+using System.ComponentModel;
 using System.Security.Permissions;
 using System.Security.Principal;
 using System.Text;
@@ -39,6 +40,33 @@ namespace System.Web.Security
        [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
        public sealed class FormsAuthenticationModule : IHttpModule
        {
+               static readonly object authenticateEvent = new object ();
+               
+#if NET_2_0
+               AuthenticationSection _config = null;
+#else
+               AuthConfig _config = null;
+#endif
+               bool isConfigInitialized = false;
+               EventHandlerList events = new EventHandlerList ();
+               
+               public event FormsAuthenticationEventHandler Authenticate {
+                       add { events.AddHandler (authenticateEvent, value); }
+                       remove { events.RemoveHandler (authenticateEvent, value); }
+               }
+               
+               private void InitConfig (HttpContext context)
+               {
+                       if(isConfigInitialized)
+                               return;
+#if NET_2_0
+                       _config = (AuthenticationSection) WebConfigurationManager.GetSection ("system.web/authentication");
+#else
+                       _config = (AuthConfig) context.GetConfig ("system.web/authentication");
+#endif
+                       isConfigInitialized = true;
+               }
+
                [SecurityPermission (SecurityAction.Demand, UnmanagedCode = true)]
                public FormsAuthenticationModule ()
                {
@@ -64,26 +92,21 @@ namespace System.Web.Security
                        string loginPage;
                        bool slidingExpiration;
 
-#if NET_2_0
-                       AuthenticationSection config = (AuthenticationSection) WebConfigurationManager.GetSection ("system.web/authentication");
-#else
-                       AuthConfig config = (AuthConfig) context.GetConfig ("system.web/authentication");
-#endif
-
-                       if (config == null || config.Mode != AuthenticationMode.Forms) {
+                       InitConfig (context);
+                       if (_config == null || _config.Mode != AuthenticationMode.Forms) {
                                return;
                        }
 
 #if NET_2_0
-                       cookieName = config.Forms.Name;
-                       cookiePath = config.Forms.Path;
-                       loginPage = config.Forms.LoginUrl;
-                       slidingExpiration = config.Forms.SlidingExpiration;
+                       cookieName = _config.Forms.Name;
+                       cookiePath = _config.Forms.Path;
+                       loginPage = _config.Forms.LoginUrl;
+                       slidingExpiration = _config.Forms.SlidingExpiration;
 #else
-                       cookieName = config.CookieName;
-                       cookiePath = config.CookiePath;
-                       loginPage = config.LoginUrl;
-                       slidingExpiration = config.SlidingExpiration;
+                       cookieName = _config.CookieName;
+                       cookiePath = _config.CookiePath;
+                       loginPage = _config.LoginUrl;
+                       slidingExpiration = _config.SlidingExpiration;
 #endif
 
                        string reqPath = "";
@@ -103,8 +126,9 @@ namespace System.Web.Security
 #endif
 
                        FormsAuthenticationEventArgs formArgs = new FormsAuthenticationEventArgs (context);
-                       if (Authenticate != null)
-                               Authenticate (this, formArgs);
+                       FormsAuthenticationEventHandler eh = events [authenticateEvent] as FormsAuthenticationEventHandler;
+                       if (eh != null)
+                               eh (this, formArgs);
 
                        bool contextUserNull = (context.User == null);
                        if (formArgs.User != null || !contextUserNull) {
@@ -153,23 +177,20 @@ namespace System.Web.Security
                                return;
 
                        string loginPage;
+                       InitConfig (context);
 #if NET_2_0
-                       AuthenticationSection config = (AuthenticationSection) WebConfigurationManager.GetSection ("system.web/authentication");
-                       loginPage = config.Forms.LoginUrl;
+                       loginPage = _config.Forms.LoginUrl;
 #else
-                       AuthConfig config = (AuthConfig) context.GetConfig ("system.web/authentication");
-                       loginPage = config.LoginUrl;
+                       loginPage = _config.LoginUrl;
 #endif
-                       if (config == null || config.Mode != AuthenticationMode.Forms)
+                       if (_config == null || _config.Mode != AuthenticationMode.Forms)
                                return;
 
                        StringBuilder login = new StringBuilder ();
                        login.Append (UrlUtils.Combine (context.Request.ApplicationPath, loginPage));
                        login.AppendFormat ("?ReturnUrl={0}", HttpUtility.UrlEncode (context.Request.RawUrl));
-                       context.Response.Redirect (login.ToString ());
+                       context.Response.Redirect (login.ToString (), false);
                }
-
-               public event FormsAuthenticationEventHandler Authenticate;
        }
 }