Click here to Skip to main content
15,897,187 members
Articles / Web Development / ASP.NET

Race to Linux - Race 2: Time Tracker Starter Kit

Rate me:
Please Sign up or sign in to vote.
4.25/5 (5 votes)
26 Sep 20051 min read 40.5K   274   16  
Time Tracker Starter Kit port to Linux using Mono and FireBird
using System;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using System.Threading;
using System.Globalization;
using System.Configuration;
using ASPNET.StarterKit.TimeTracker.BusinessLogicLayer;

namespace ASPNET.StarterKit.TimeTracker.Web
{
	// Global Application
	public class Global : System.Web.HttpApplication
	{
		// Configuation constants used for retrieving application setting values from the
		// web.config file.
		public const string CfgKeyConnString = "ConnectionString";
		public const string CfgKeyUserAcctSource = "UserAccountSource";
		public const string CfgKeyDefaultRole = "DefaultRoleForNewUser";
		public const string CfgKeyFirstDayOfWeek = "FirstDayOfWeek";

		// Constants used to reference data stored in cookies
		public const string UserRoles = "userroles";
		public const string MobileUserRoles = "mobileuserroles";

		public Global()
		{
		}	
		
		//*********************************************************************
		//
		// Application_BeginRequest Event
		//
		// The Application_BeginRequest method is an ASP.NET event that executes 
		// on each web request into the portal application.  
		//
		// The thread culture is set for each request using the language
		// settings specified in the browser.
		// 
		//*********************************************************************

		protected void Application_BeginRequest(Object sender, EventArgs e)
		{
			try
			{
				if (Request.UserLanguages != null)
					Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);
				else
					// Default to English if there are no user languages
					Thread.CurrentThread.CurrentCulture = new CultureInfo("en-us");

				Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
			}
			catch 
			{
				Thread.CurrentThread.CurrentCulture = new CultureInfo("en-us");
			}
		}
                          
		//*********************************************************************
		//
		// Application_AuthenticateRequest Event
		//
		// If the client is authenticated with the application, then determine
		// which security roles he/she belongs to and replace the "User" intrinsic
		// with a custom IPrincipal security object that permits "User.IsInRole"
		// role checks within the application
		//
		// Roles are cached in the browser in an in-memory encrypted cookie.  If the
		// cookie doesn't exist yet for this session, create it.
		//
		//*********************************************************************

		protected void Application_AuthenticateRequest(Object sender, EventArgs e)
		{
			string userInformation = String.Empty;

			if (Request.IsAuthenticated == true) 
			{
				// Create the roles cookie if it doesn't exist yet for this session.
				if ((Request.Cookies[UserRoles] == null) || (Request.Cookies[UserRoles].Value == "")) 
				{
					// Retrieve the user's role and ID information and add it to
					// the cookie
					TTUser user = new TTUser(User.Identity.Name);
					if (!user.Load())
					{
						// The user was not found in the Time Tracker database so add them using
						// the default role.  Specifying a UserID of 0 will result in the user being 
						// inserted into the database.
						TTUser newUser = new TTUser(0, Context.User.Identity.Name,
							String.Empty, ConfigurationSettings.AppSettings[CfgKeyDefaultRole]);
						newUser.Save();
						user = newUser;
					}
                
					// Create a string to persist the role and user id
					userInformation = user.UserID + ";" + user.Role + ";" + user.Name;

					// Create a cookie authentication ticket.
					FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
						1,                              // version
						User.Identity.Name,			    // user name
						DateTime.Now,                   // issue time
						DateTime.Now.AddHours(1),       // expires every hour
						false,                          // don't persist cookie
						userInformation                    
						);

					// Encrypt the ticket
					String cookieStr = FormsAuthentication.Encrypt(ticket);

					// Send the cookie to the client
					Response.Cookies[UserRoles].Value = cookieStr;
					Response.Cookies[UserRoles].Path = "/";
					Response.Cookies[UserRoles].Expires = DateTime.Now.AddMinutes(1);

					// Add our own custom principal to the request containing the user's identity, the user id, and
					// the user's role 
					Context.User = new CustomPrincipal(User.Identity, user.UserID, user.Role, user.Name);
				}
				else 
				{
					// Get roles from roles cookie
					FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Context.Request.Cookies[UserRoles].Value);
					userInformation = ticket.UserData;

					// Add our own custom principal to the request containing the user's identity, the user id, and
					// the user's role from the auth ticket
					string [] info = userInformation.Split( new char[] {';'} );
					Context.User = new CustomPrincipal(
						User.Identity, 
						Convert.ToInt32(info[0].ToString()), 
						info[1].ToString(),
						info[2].ToString());
				}
			}
		}

		//*********************************************************************
		//
		// GetApplicationPath Method
		//
		// This method returns the correct relative path when installing
		// the portal on a root web site instead of virtual directory
		//
		//*********************************************************************

		public static string GetApplicationPath(HttpRequest request) 
		{
			string path = string.Empty;
			try 
			{
				if(request.ApplicationPath != "/")
					path = request.ApplicationPath;
			}
			catch (Exception e)
			{
				throw e;
			}
			return path;
		}
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
Uruguay Uruguay
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions