Current Path : C:/Windows/Microsoft.NET/Framework/v4.0.30319/ASP.NETWebAdminFiles/App_Code/ |
Current File : C:/Windows/Microsoft.NET/Framework/v4.0.30319/ASP.NETWebAdminFiles/App_Code/WebAdminPage.cs |
//------------------------------------------------------------------------------ // <copyright file="WebAdminPage.cs" company="Microsoft"> // Copyright (c) Microsoft Corporation. All rights reserved. // </copyright> //------------------------------------------------------------------------------ namespace System.Web.Administration { using System.Collections; using System.Collections.Specialized; using System.Configuration; using System.Diagnostics; using System.Globalization; using System.Reflection; using System.Security; using System.Text; using System.Web; using System.Web.Configuration; using System.Web.Hosting; using System.Web.Management; using System.Web.Security; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Security.Permissions; public class WebAdminPage : Page { private const string APP_PATH = "WebAdminApplicationPath"; private const string APP_PHYSICAL_PATH = "WebAdminPhysicalPath"; private const string CURRENT_EXCEPTION = "WebAdminCurrentException"; private const string CURRENT_PROVIDER = "WebAdminCurrentProvider"; private const string CURRENT_ROLE = "WebAdminCurrentRoleName"; private const string CURRENT_USER = "WebAdminCurrentUser"; private const string CURRENT_USER_COLLECTION = "WebAdminUserCollection"; private const string URL_STACK = "WebAdminUrlStack"; private string _directionality; private NavigationBar _navigationBar = null; public WebAdminRemotingManager RemotingManager { get { return (WebAdminRemotingManager)Session["WebAdminRemotingManager"]; } } public object CallWebAdminHelperMethod(bool isMembership, string methodName, object[] parameters, Type[] paramTypes) { object returnObject = null; object tempObject = null; tempObject = RemotingManager.ConfigurationHelperInstance; if (tempObject != null) { string methodName2 = string.Empty; string typeFullName = WebAdminRemotingManager.AssemblyVersionString; if (isMembership) { methodName2 = "CallMembershipProviderMethod"; } else { methodName2 = "CallRoleProviderMethod"; } Type tempType = Type.GetType(typeFullName); BindingFlags allBindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; MethodInfo method = tempType.GetMethod(methodName2, allBindingFlags); if (method != null) { object[] newParameters = new object[]{methodName, parameters, paramTypes}; try { object[] returnArrayObj = (object[]) method.Invoke(tempObject, newParameters); if (returnArrayObj != null) { returnObject = returnArrayObj[0]; } } catch (Exception ex) { if (ex.InnerException != null) { if (ex.InnerException.InnerException != null) { throw new WebAdminException(ex.InnerException.InnerException.Message); } else { throw new WebAdminException(ex.InnerException.Message); } } else { throw new WebAdminException(ex.Message); } } } } return returnObject; } public VirtualDirectory GetVirtualDirectory(string virtualDir) { return RemotingManager.GetVirtualDirectory(virtualDir); } public void SaveConfig(Configuration config) { RemotingManager.ShutdownTargetApplication(); // check if session expired if (String.IsNullOrEmpty(ApplicationPath) || String.IsNullOrEmpty((string)Session[APP_PHYSICAL_PATH])) { Server.Transfer("~/home2.aspx"); } config.Save(ConfigurationSaveMode.Minimal); } public string ApplicationPath { get { return (string)Session[APP_PATH]; } } protected virtual bool CanSetApplicationPath { get { return false; } } protected string CurrentProvider { get { object obj = (object)Session[CURRENT_PROVIDER]; if (obj != null) { return (string)Session[CURRENT_PROVIDER]; } return String.Empty; } set { Session[CURRENT_PROVIDER] = value; } } protected string CurrentRequestUrl { get { Stack stack = (Stack) Session[URL_STACK]; if (stack != null && stack.Count > 0) { return(string)stack.Peek(); } return string.Empty; } } protected string CurrentRole { get { object obj = (object)Session[CURRENT_ROLE]; if (obj != null) { return (string)Session[CURRENT_ROLE]; } return String.Empty; } set { Session[CURRENT_ROLE] = value; } } protected string CurrentUser { get { object obj = (string)Session[CURRENT_USER]; if (obj != null) { return (string)Session[CURRENT_USER]; } return String.Empty; } set { Session[CURRENT_USER] = value; } } public string Directionality { get { if (String.IsNullOrEmpty(_directionality)) { _directionality = ((string) GetGlobalResourceObject("GlobalResources", "HtmlDirectionality")).ToLower(); } return _directionality; } } public HorizontalAlign DirectionalityHorizontalAlign { get { if (Directionality == "rtl") { return HorizontalAlign.Right; } else { return HorizontalAlign.Left; } } } public Hashtable UserCollection { get { Hashtable table = (Hashtable) Session[CURRENT_USER_COLLECTION]; if (table == null) { Session[CURRENT_USER_COLLECTION] = table = new Hashtable(); } return table; } } public NavigationBar NavigationBar { get { return _navigationBar; } set { _navigationBar = value; } } public string UnderscoreProductVersion { get { return Environment.Version.ToString(3).Replace(".", "_"); } } public static Exception GetCurrentException(HttpContext c) { return (Exception)c.Session[CURRENT_EXCEPTION]; } public static void SetCurrentException(HttpContext c, Exception ex) { c.Session[CURRENT_EXCEPTION] = ex; } protected void ClearBadStackPage() { Stack stack = (Stack) Session[URL_STACK]; if (stack == null || stack.Count < 2) { return; } stack.Pop(); // current url stack.Pop(); // prev url // push current url back on stack. if (string.Compare(CurrentRequestUrl, Request.CurrentExecutionFilePath) != 0) { PushRequestUrl(Request.CurrentExecutionFilePath); } } public void ClearUserCollection() { Session[CURRENT_USER_COLLECTION] = null; } public static string GetParentPath(string path) { if (String.IsNullOrEmpty(path) || path[0] != '/') return null; int index = path.LastIndexOf('/'); if (index < 0) return null; // parent for the root app is machine.config (null) if (path == "/") return null; string returnPath = path.Substring(0, index); if (returnPath.Length == 0 || returnPath == "/") { // for cassini, if returning / // then return null instead. returnPath = null; } return returnPath; } protected string GetQueryStringAppPath() { return Request.QueryString["applicationUrl"]; } protected string GetQueryStringPhysicalAppPath() { return Request.QueryString["applicationPhysicalPath"]; } public bool IsRoleManagerEnabled() { try { RoleManagerSection roleSection = null; Configuration config = OpenWebConfiguration(ApplicationPath); roleSection = (RoleManagerSection)config.GetSection("system.web/roleManager"); return roleSection.Enabled; } catch { return false; } } public bool IsRuleValid(BaseValidator placeHolderValidator, RadioButton userRadio, TextBox userName, RadioButton roleRadio, DropDownList roles) { if (userRadio.Checked && userName.Text.Trim().Length == 0) { placeHolderValidator.ErrorMessage = ((string)GetGlobalResourceObject("GlobalResources", "NonemptyUser")); placeHolderValidator.IsValid = false; return false; } if (roleRadio.Checked && roles.SelectedItem == null) { placeHolderValidator.ErrorMessage = ((string)GetGlobalResourceObject("GlobalResources", "NonemptyRole")); placeHolderValidator.IsValid = false; return false; } if (userRadio.Checked) { string userNameString = userName.Text.Trim(); if (-1 != userNameString.IndexOf('*')) { placeHolderValidator.ErrorMessage = ((string)GetGlobalResourceObject("GlobalResources", "InvalidRuleName")); placeHolderValidator.IsValid = false; return false; } } return true; } public bool IsWindowsAuth() { Configuration config = OpenWebConfiguration(ApplicationPath); AuthenticationSection auth = (AuthenticationSection)config.GetSection("system.web/authentication"); return auth.Mode == AuthenticationMode.Windows; } protected void ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) { ListItemType itemType = e.Item.ItemType; if ((itemType == ListItemType.Pager) || (itemType == ListItemType.Header) || (itemType == ListItemType.Footer)) { return; } foreach (Control c in e.Item.Cells[0].Controls) { LinkButton button = c as LinkButton; if (button == null) { continue; } e.Item.Attributes["onclick"] = GetPostBackClientHyperlink(button, String.Empty); } } public Configuration OpenWebConfiguration(string path) { return OpenWebConfiguration(path, false); } public Configuration OpenWebConfiguration(string path, bool getWebConfigForSubDir) { string appPhysPath = (string)Session[APP_PHYSICAL_PATH]; return OpenWebConfiguration(path, appPhysPath, getWebConfigForSubDir); } private Configuration OpenWebConfiguration(string path, string appPhysPath, bool getWebConfigForSubDir) { // check if session expired if (String.IsNullOrEmpty(ApplicationPath) || String.IsNullOrEmpty((string)Session[APP_PHYSICAL_PATH])) { Server.Transfer("~/home2.aspx"); } if (String.IsNullOrEmpty(path)) { return WebConfigurationManager.OpenWebConfiguration(null); } string appVPath = (string)Session[APP_PATH]; if (!getWebConfigForSubDir) { appVPath = path; } WebConfigurationFileMap fileMap = new WebConfigurationFileMap(); fileMap.VirtualDirectories.Add(appVPath, new VirtualDirectoryMapping(appPhysPath, true)); return WebConfigurationManager.OpenMappedWebConfiguration(fileMap, path); } protected override void OnInit(EventArgs e) { string applicationPath = ApplicationPath; string queryStringAppPath = GetQueryStringAppPath(); string applicationPhysicalPath = GetQueryStringPhysicalAppPath(); string requestAppPath = HttpContext.Current.Request.ApplicationPath; string currExFilePath = Request.CurrentExecutionFilePath; if (applicationPhysicalPath != null) { string webAdminVersion = "aspnet_webadmin\\" + UnderscoreProductVersion + "\\"; if (applicationPhysicalPath.EndsWith(webAdminVersion)) { queryStringAppPath = requestAppPath; } } SetApplicationPath(); if (string.Compare(CurrentRequestUrl, Request.CurrentExecutionFilePath) != 0) { PushRequestUrl(Request.CurrentExecutionFilePath); } base.OnInit(e); } protected void PopulateRepeaterDataSource(Repeater repeater) { // display alphabet row only if language is has Alphabet resource ArrayList arr = new ArrayList(); String chars = ((string)GetGlobalResourceObject("GlobalResources", "Alphabet")); foreach (String s in chars.Split(';')) { arr.Add(s); } if (arr.Count == 0) { repeater.Visible = false; } else { arr.Add((string)GetGlobalResourceObject("GlobalResources", "All")); repeater.DataSource = arr; repeater.Visible = true; } } protected string PopPrevRequestUrl() { Stack stack = (Stack) Session[URL_STACK]; if (stack == null || stack.Count < 2) { return string.Empty; } stack.Pop(); // discard current url return(string) stack.Pop(); } protected void PushRequestUrl(string s) { Stack stack = (Stack) Session[URL_STACK]; if (stack == null) { Session[URL_STACK] = stack = new Stack(); } stack.Push(s); } protected void ReturnToPreviousPage(object sender, EventArgs e) { string prevRequest = PopPrevRequestUrl(); Response.Redirect(prevRequest, false); // note: string.Empty ok here. } protected void RetrieveLetter(object sender, RepeaterCommandEventArgs e, GridView dataGrid) { RetrieveLetter(sender, e, dataGrid, (string)GetGlobalResourceObject("GlobalResources", "All")); } protected void RetrieveLetter(object sender, RepeaterCommandEventArgs e, GridView dataGrid, string all) { RetrieveLetter(sender, e, dataGrid, all, null); } protected void RetrieveLetter(object sender, RepeaterCommandEventArgs e, GridView dataGrid, string all, MembershipUserCollection users) { dataGrid.PageIndex = 0; int total = 0; string arg = e.CommandArgument.ToString(); if (arg == all) { dataGrid.DataSource = (users == null) ? (MembershipUserCollection)CallWebAdminHelperMethod(true, "GetAllUsers", new object[] {0, Int32.MaxValue, total}, new Type[] {typeof(int),typeof(int),Type.GetType("System.Int32&")}) : users; } else { dataGrid.DataSource = (MembershipUserCollection)CallWebAdminHelperMethod(true, "FindUsersByName", new object[] {(string) arg + "%", 0, Int32.MaxValue, total}, new Type[] {typeof(string), typeof(int), typeof(int), Type.GetType("System.Int32&")}); } dataGrid.DataBind(); } protected void SetApplicationPath() { if (!VerifyAppValid()) { Server.Transfer("~/error.aspx"); } } // At point when app is set, verify it is valid (i.e., permissions are proper and app exists). private bool VerifyAppValid() { // check if session expired if (String.IsNullOrEmpty(ApplicationPath) || String.IsNullOrEmpty((string)Session[APP_PHYSICAL_PATH])) { Server.Transfer("~/home2.aspx"); } try { Configuration config = OpenWebConfiguration(ApplicationPath); SaveConfig(config); } catch (Exception e) { Exception ex = new Exception((string) e.ToString()); SetCurrentException(Context, ex); return false; } return true; } } public sealed class WebAdminModule : IHttpModule { private const string APP_PATH = "WebAdminApplicationPath"; private const string APP_PHYSICAL_PATH = "WebAdminPhysicalPath"; private const string REMOTING_MANAGER = "WebAdminRemotingManager"; private void ApplicationError(object sender, EventArgs e) { Exception exception = ((HttpApplication)sender).Server.GetLastError().InnerException; HttpContext context = ((HttpApplication)sender).Context; string redirectUrl = "~/error.aspx"; if (String.IsNullOrEmpty(redirectUrl)) { return; } WebAdminPage.SetCurrentException(context, exception); ((HttpApplication)sender).Server.Transfer(String.Format(CultureInfo.InvariantCulture, redirectUrl), true); } public void Init(HttpApplication application) { application.Error += (new EventHandler(this.ApplicationError)); application.AcquireRequestState += new EventHandler(this.OnEnter); } public void Dispose() { } private void OnEnter(Object sender, EventArgs eventArgs) { HttpApplication application = (HttpApplication)sender; if (!application.Context.Request.IsLocal) { SecurityException securityException = new SecurityException((string)HttpContext.GetGlobalResourceObject("GlobalResources", "WebAdmin_ConfigurationIsLocalOnly")); WebAdminPage.SetCurrentException(application.Context, securityException); application.Server.Transfer("~/error.aspx"); } if (application != null) { SetSessionVariables(application); } application.Response.Cache.SetCacheability(HttpCacheability.NoCache); } private void SetSessionVariables(HttpApplication application) { string queryStringAppPath = string.Empty; string queryStringApplicationPhysicalPath = string.Empty; string applicationPath = string.Empty; string applicationPhysicalPath = string.Empty; string setAppPath = string.Empty; string setAppPhysPath = string.Empty; try { SecurityPermission permission = new SecurityPermission(PermissionState.Unrestricted); permission.Demand(); } catch { Exception permissionException = new Exception((string)HttpContext.GetGlobalResourceObject("GlobalResources", "FullTrustRequired")); WebAdminPage.SetCurrentException(application.Context, permissionException); application.Server.Transfer("~/error.aspx"); } if (application.Context.Request != null) { queryStringAppPath = (string) application.Context.Request.QueryString["applicationUrl"]; queryStringApplicationPhysicalPath = (string) application.Context.Request.QueryString["applicationPhysicalPath"]; } if (application.Context.Session != null) { if (application.Context.Session[APP_PATH] != null) { applicationPath = (string)application.Context.Session[APP_PATH]; } if (application.Context.Session[APP_PHYSICAL_PATH] != null) { applicationPhysicalPath = (string)application.Context.Session[APP_PHYSICAL_PATH]; } } if ((String.IsNullOrEmpty(queryStringAppPath) && applicationPath == null) || (String.IsNullOrEmpty(queryStringApplicationPhysicalPath) && applicationPhysicalPath == null) ) { application.Server.Transfer("~/home0.aspx", false); return; } if (!String.IsNullOrEmpty(queryStringAppPath)) { setAppPath = queryStringAppPath; } else if (!String.IsNullOrEmpty(applicationPath)) { setAppPath = applicationPath; } if (!String.IsNullOrEmpty(queryStringApplicationPhysicalPath)) { setAppPhysPath = queryStringApplicationPhysicalPath; } else if (!String.IsNullOrEmpty(applicationPhysicalPath)) { setAppPhysPath = applicationPhysicalPath; } if (application.Context.Session != null) { application.Context.Session[APP_PATH] = setAppPath; application.Context.Session[APP_PHYSICAL_PATH] = setAppPhysPath; application.Context.Session[REMOTING_MANAGER] = new WebAdminRemotingManager(setAppPath, setAppPhysPath, application.Context.Session); } } } public sealed class WebAdminMembershipProvider : MembershipProvider { public WebAdminMembershipProvider() { } public WebAdminRemotingManager RemotingManager { get { return (WebAdminRemotingManager) HttpContext.Current.Session["WebAdminRemotingManager"]; } } public object CallWebAdminMembershipProviderHelperMethod(string methodName, object[] parameters, Type[] paramTypes) { object returnObject = null; object tempObject = null; tempObject = RemotingManager.ConfigurationHelperInstance; if (tempObject != null) { string typeFullName = WebAdminRemotingManager.AssemblyVersionString; Type tempType = Type.GetType(typeFullName); BindingFlags allBindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; MethodInfo method = tempType.GetMethod("CallMembershipProviderMethod", allBindingFlags); if (method != null) { object[] newParameters = new object[]{methodName, parameters, paramTypes}; object[] returnArrayObj = (object[]) method.Invoke(tempObject, newParameters); if (returnArrayObj != null) { returnObject = returnArrayObj[0]; } } } return returnObject; } public object[] CallWebAdminMembershipProviderHelperMethodOutParams(string methodName, object[] parameters, Type[] paramTypes) { object[] returnObjectArray = new object[0]; object tempObject = RemotingManager.ConfigurationHelperInstance; if (tempObject != null) { string typeFullName = WebAdminRemotingManager.AssemblyVersionString; Type tempType = Type.GetType(typeFullName); BindingFlags allBindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; MethodInfo method = tempType.GetMethod("CallMembershipProviderMethod", allBindingFlags); if (method != null) { object[] newParameters = new object[]{methodName, parameters, paramTypes}; object[] returnArrayObj = (object[]) method.Invoke(tempObject, newParameters); if (returnArrayObj != null) { returnObjectArray = returnArrayObj; } } } return returnObjectArray; } public object GetWebAdminMembershipProviderHelperProperty(string propertyName) { object returnObject = null; object tempObject = null; tempObject = RemotingManager.ConfigurationHelperInstance; if (tempObject != null) { string typeFullName = WebAdminRemotingManager.AssemblyVersionString; Type tempType = Type.GetType(typeFullName); BindingFlags allBindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; MethodInfo method = tempType.GetMethod("GetMembershipProviderProperty", allBindingFlags); if (method != null) { object[] newParameters = new object[]{propertyName}; returnObject = method.Invoke(tempObject, newParameters); } } return returnObject; } public override string ApplicationName { get { return (string)GetWebAdminMembershipProviderHelperProperty("ApplicationName"); } set {;} } public override bool EnablePasswordRetrieval{ get { return (bool)GetWebAdminMembershipProviderHelperProperty("EnablePasswordRetrieval"); } } public override bool EnablePasswordReset { get{ return (bool)GetWebAdminMembershipProviderHelperProperty("EnablePasswordReset"); } } public override bool RequiresQuestionAndAnswer { get { return (bool)GetWebAdminMembershipProviderHelperProperty("RequiresQuestionAndAnswer"); } } public override bool RequiresUniqueEmail { get { return (bool)GetWebAdminMembershipProviderHelperProperty("RequiresUniqueEmail"); } } public override int MaxInvalidPasswordAttempts { get { return (int)GetWebAdminMembershipProviderHelperProperty("MaxInvalidPasswordAttempts"); } } public override int PasswordAttemptWindow { get { return (int)GetWebAdminMembershipProviderHelperProperty("PasswordAttemptWindow"); } } public override MembershipPasswordFormat PasswordFormat { get { return (MembershipPasswordFormat)GetWebAdminMembershipProviderHelperProperty("PasswordFormat"); } } public override int MinRequiredPasswordLength { get { return (int)GetWebAdminMembershipProviderHelperProperty("MinRequiredPasswordLength"); } } public override int MinRequiredNonAlphanumericCharacters { get { return (int)GetWebAdminMembershipProviderHelperProperty("MinRequiredNonAlphanumericCharacters"); } } public override string PasswordStrengthRegularExpression { get { return (string)GetWebAdminMembershipProviderHelperProperty("PasswordStrengthRegularExpression"); } } public override bool ChangePassword(string name, string oldPwd, string newPwd) { return (bool)CallWebAdminMembershipProviderHelperMethod("ChangePassword", new object[]{name, oldPwd, newPwd}, new Type[] {typeof(string), typeof(string), typeof(string)}); } public override bool ChangePasswordQuestionAndAnswer(string name, string password, string newPwdQuestion, string newPwdAnswer) { return (bool)CallWebAdminMembershipProviderHelperMethod("ChangePasswordQuestionAndAnswer", new object[]{name, password, newPwdQuestion, newPwdAnswer}, new Type[] {typeof(string), typeof(string), typeof(string), typeof(string)}); } public override MembershipUser CreateUser( string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status) { MembershipUser TempUser = null; status = MembershipCreateStatus.InvalidUserName; string typeFullName = "System.Web.Security.MembershipCreateStatus&, " + typeof(HttpContext).Assembly.GetName().ToString(); Type tempType = Type.GetType(typeFullName); object[] returnAndOutParams = CallWebAdminMembershipProviderHelperMethodOutParams("CreateUser", new object[]{username, password, email, passwordQuestion, passwordAnswer, isApproved, providerUserKey, status} , new Type[] {typeof(string), typeof(string), typeof(string), typeof(string), typeof(string), typeof(bool), typeof(object), tempType}); if (returnAndOutParams != null) { TempUser = (MembershipUser) returnAndOutParams[0]; status = (MembershipCreateStatus) returnAndOutParams[8]; } if (status != MembershipCreateStatus.Success) { return null; } else { return TempUser; } } public override bool DeleteUser(string name, bool deleteAllRelatedContent) { return (bool)CallWebAdminMembershipProviderHelperMethod("DeleteUser", new object[]{name, deleteAllRelatedContent}, new Type[] {typeof(string), typeof(bool)}); } public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords) { totalRecords = 0; MembershipUserCollection TempList = (MembershipUserCollection) CallWebAdminMembershipProviderHelperMethod("GetAllUsers", new object[]{pageIndex, pageSize, totalRecords}, new Type[] {typeof(int), typeof(int),Type.GetType("System.Int32&")}); MembershipUserCollection NewList = new MembershipUserCollection(); foreach (MembershipUser TempItem in TempList) { MembershipUser NewUser = new MembershipUser(this.Name, TempItem.UserName, TempItem.ProviderUserKey, TempItem.Email, TempItem.PasswordQuestion, TempItem.Comment, TempItem.IsApproved, TempItem.IsLockedOut, TempItem.CreationDate, TempItem.LastLoginDate, TempItem.LastActivityDate, TempItem.LastPasswordChangedDate, TempItem.LastLockoutDate ); NewList.Add(NewUser); } return NewList; } public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords) { totalRecords = 0; MembershipUserCollection TempList = (MembershipUserCollection) CallWebAdminMembershipProviderHelperMethod("FindUsersByEmail", new object[]{emailToMatch, pageIndex, pageSize, totalRecords}, new Type[] {typeof(string), typeof(int), typeof(int),Type.GetType("System.Int32&")}); MembershipUserCollection NewList = new MembershipUserCollection(); foreach (MembershipUser TempItem in TempList) { MembershipUser NewUser = new MembershipUser(this.Name, TempItem.UserName, TempItem.ProviderUserKey, TempItem.Email, TempItem.PasswordQuestion, TempItem.Comment, TempItem.IsApproved, TempItem.IsLockedOut, TempItem.CreationDate, TempItem.LastLoginDate, TempItem.LastActivityDate, TempItem.LastPasswordChangedDate, TempItem.LastLockoutDate ); NewList.Add(NewUser); } return NewList; } public override int GetNumberOfUsersOnline() { return (int) CallWebAdminMembershipProviderHelperMethod("GetNumberOfUsersOnline", new object[]{}, null); } public override string GetPassword(string name, string answer) { return (string) CallWebAdminMembershipProviderHelperMethod("GetPassword", new object[]{name, answer}, new Type[] {typeof(string), typeof(string)}); } public override MembershipUser GetUser(string name, bool userIsOnline) { MembershipUser TempUser = (MembershipUser)CallWebAdminMembershipProviderHelperMethod("GetUser", new object[]{name, userIsOnline}, new Type[] {typeof(string), typeof(bool)}); MembershipUser NewUser = new MembershipUser(this.Name, TempUser.UserName, TempUser.ProviderUserKey, TempUser.Email, TempUser.PasswordQuestion, TempUser.Comment, TempUser.IsApproved, TempUser.IsLockedOut, TempUser.CreationDate, TempUser.LastLoginDate, TempUser.LastActivityDate, TempUser.LastPasswordChangedDate, TempUser.LastLockoutDate ); return NewUser; } public override string GetUserNameByEmail(string email) { return (string)CallWebAdminMembershipProviderHelperMethod("GetUserNameByEmail", new object[]{email}, new Type[] {typeof(string)}); } public override string ResetPassword(string name, string answer) { return (string)CallWebAdminMembershipProviderHelperMethod("ResetPassword", new object[]{name, answer}, new Type[] {typeof(string), typeof(string)}); } public override void UpdateUser(MembershipUser user) { string typeFullName = "System.Web.Security.MembershipUser, " + typeof(HttpContext).Assembly.GetName().ToString();; Type tempType = Type.GetType(typeFullName); CallWebAdminMembershipProviderHelperMethod("UpdateUser", new object[] {(MembershipUser) user}, new Type[] {tempType}); } public override bool ValidateUser(string name, string password) { return (bool)CallWebAdminMembershipProviderHelperMethod("ValidateUser", new object[]{name, password}, new Type[] {typeof(string), typeof(string)}); } public override MembershipUser GetUser( object providerUserKey, bool userIsOnline ) { return (MembershipUser)CallWebAdminMembershipProviderHelperMethod("GetUser", new object[]{providerUserKey, userIsOnline}, new Type[] {typeof(object), typeof(bool)}); } public override bool UnlockUser( string name ) { return (bool)CallWebAdminMembershipProviderHelperMethod("UnlockUser", new object[]{name}, new Type[] {typeof(string)}); } public override void Initialize(string name, NameValueCollection config) { if (String.IsNullOrEmpty(name)) { name = "WebAdminMembershipProvider"; } base.Initialize(name, config); } public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords) { totalRecords = 0; MembershipUserCollection TempList = (MembershipUserCollection)CallWebAdminMembershipProviderHelperMethod("FindUsersByName", new object[]{usernameToMatch, pageIndex, pageSize, totalRecords}, new Type[] {typeof(string), typeof(int), typeof(int), Type.GetType("System.Int32&")}); MembershipUserCollection NewList = new MembershipUserCollection(); foreach (MembershipUser TempItem in TempList) { MembershipUser NewUser = new MembershipUser(this.Name, TempItem.UserName, TempItem.ProviderUserKey, TempItem.Email, TempItem.PasswordQuestion, TempItem.Comment, TempItem.IsApproved, TempItem.IsLockedOut, TempItem.CreationDate, TempItem.LastLoginDate, TempItem.LastActivityDate, TempItem.LastPasswordChangedDate, TempItem.LastLockoutDate ); NewList.Add(NewUser); } return NewList; } } public sealed class WebAdminRemotingManager : MarshalByRefObject { private ApplicationManager _appManager; private string _applicationMetaPath; private string _applicationPhysicalPath; private HttpSessionState _session; private object _configurationHelper; private static string _assemblyVersion; public WebAdminRemotingManager(string applicationMetaPath, string applicationPhysicalPath, HttpSessionState session) { _applicationMetaPath = applicationMetaPath; _applicationPhysicalPath = applicationPhysicalPath; _session = session; } public override Object InitializeLifetimeService(){ return null; // never expire lease } public static string AssemblyVersionString { get { if (String.IsNullOrEmpty(_assemblyVersion)) { _assemblyVersion = "System.Web.Administration.WebAdminConfigurationHelper, " + typeof(HttpContext).Assembly.GetName().ToString(); } return _assemblyVersion; } } private ApplicationManager AppManager { get { if (_appManager == null) { return _appManager = ApplicationManager.GetApplicationManager(); } return _appManager; } } protected string ApplicationMetaPath { get { return _applicationMetaPath; } } public string ApplicationPhysicalPath { get { return _applicationPhysicalPath; } set { _applicationPhysicalPath = value; // Set provider proxy references to null, to account for the edge case where ApplicationPhysicalPath is set twice. // Notes: this does not shut down the target appdomain, which is the desired behavior, since, in the unlikely case where the // ApplicationPhysicalPath is changed, the change is likely to be reverted. Resetting the providers is necessary because // the existing providers point to the old target appdomain. ResetProviders(); } } public object ConfigurationHelperInstance { get { return CreateConfigurationHelper(); } } private HttpSessionState Session { get { return _session; } } public string TargetAppId { get { if (Session["WebAdminTargetAppId"] != null) { return (string)Session["WebAdminTargetAppId"]; } else { return string.Empty; } } set { Session["WebAdminTargetAppId"] = value; } } private object CreateConfigurationHelper() { if (_configurationHelper != null) { return _configurationHelper; } string appPath = ApplicationMetaPath; string appPhysPath = ApplicationPhysicalPath; string targetAppId = String.Empty; string typeFullName = WebAdminRemotingManager.AssemblyVersionString; Type tempType = Type.GetType(typeFullName); // Put together some unique app id string appId = (String.Concat(appPath, appPhysPath).GetHashCode()).ToString("x", CultureInfo.InvariantCulture); _configurationHelper = (object)ApplicationManager.GetApplicationManager().CreateObject(appId, tempType, appPath, appPhysPath, false, true); TargetAppId = appId; return _configurationHelper; } private void EnsureTargetAppId() { if (TargetAppId != null) { return; } // In some cases, the target appdomain exists before the AppId is discovered by AppManager.CreateObjectWithDefaultAppHostAndAppId // (for example if the target app is already running). In this case, retrieve one of the // providers (we make an arbitrary choice to retrieve the membership provider). This forces the object to // discover the target appid. CreateConfigurationHelper(); // Retrieves the target appid. } public VirtualDirectory GetVirtualDirectory(string virtualDir) { VirtualDirectory vdir = null; object configHelperObject = ConfigurationHelperInstance; if (configHelperObject != null) { string typeFullName = WebAdminRemotingManager.AssemblyVersionString; Type tempType = Type.GetType(typeFullName); BindingFlags allBindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; MethodInfo method = tempType.GetMethod("GetVirtualDirectory", allBindingFlags); if (method != null) { vdir = (VirtualDirectory) method.Invoke(configHelperObject, new object[]{virtualDir}); } } return vdir; } public void ResetProviders() { _configurationHelper = null; TargetAppId = null; } public void ShutdownTargetApplication() { // CONSIDER: Rather than calling EnsureTargetAppId(), is there a method on AppManager that can tell us whether // an appdomain exists based on the Id, and another method that creates the "default Id" from the application // path and physical path? This prevents the following two lines from creating the appdomain and immediately // shutting it down in the (edge) case where the target appdomain doesn't exist. EnsureTargetAppId(); AppManager.ShutdownApplication(TargetAppId); // ResetProviders to ensure that the value of TargetAppId is in sync with the provider proxies. Calling // property get for a provider proxy sets TargetAppId to the correct value. ResetProviders(); } } public class WebAdminUserControl : UserControl { private string _directionality; public enum DatabaseType { Access = 0, Sql = 1, } public string Directionality { get { if (String.IsNullOrEmpty(_directionality)) { _directionality = ((string) GetGlobalResourceObject("GlobalResources", "HtmlDirectionality")).ToLower(); } return _directionality; } } public HorizontalAlign DirectionalityHorizontalAlign { get { if (Directionality == "rtl") { return HorizontalAlign.Right; } else { return HorizontalAlign.Left; } } } public virtual bool OnNext() { return true; // move to next control. Override to return false if next should not be honored. } public virtual bool OnPrevious() { return true; // move to next control. Override to return false if prev should not be honored. } } [Serializable] public class WebAdminException : Exception { public WebAdminException() {} public WebAdminException( string message ) : base( message ) {} } }