private static string[] GetRolesAndSetCookieInternal() { string[] currentUserRoles = new string[0]; String hostName = WebUtils.GetHostName(); SiteSettings siteSettings = CacheHelper.GetCurrentSiteSettings(); if (siteSettings != null) { string roleCookieName = SiteUtils.GetRoleCookieName(siteSettings); currentUserRoles = SiteUser.GetRoles(siteSettings, HttpContext.Current.User.Identity.Name); string roleStr = ""; foreach (string role in currentUserRoles) { roleStr += role; roleStr += ";"; } if (WebConfigSettings.PreEncryptRolesForCookie) { roleStr = SiteUtils.Encrypt(roleStr); } FormsAuthenticationTicket ticket = new FormsAuthenticationTicket( 1, // version HttpContext.Current.User.Identity.Name, // user name DateTime.Now, // issue time DateTime.Now.AddHours(1), // expires every hour false, // don't persist cookie roleStr // roles ); string cookieStr = FormsAuthentication.Encrypt(ticket); HttpCookie roleCookie = new HttpCookie(roleCookieName, cookieStr); //roleCookie.Expires = DateTime.Now.AddMinutes(20); roleCookie.HttpOnly = true; roleCookie.Path = "/"; if ((SiteUtils.SslIsAvailable()) && WebConfigSettings.RequireSslForRoleCookie) { roleCookie.Secure = true; } HttpContext.Current.Response.Cookies.Add(roleCookie); } return(currentUserRoles); }
/// <summary> /// required implementation /// </summary> /// <param name="username">a username</param> /// <returns>a list of roles</returns> public override string[] GetRolesForUser(string userName) { if (HttpContext.Current != null) { SiteSettings siteSettings = CacheHelper.GetCurrentSiteSettings(); string roleCookieName = SiteUtils.GetRoleCookieName(siteSettings); if ((HttpContext.Current.Request.IsAuthenticated) && (HttpContext.Current.User.Identity.Name == userName) && (siteSettings != null) ) { if ( (CookieHelper.CookieExists(roleCookieName)) && (CookieHelper.GetCookieValue(roleCookieName).Length > 0) ) { return(GetRolesFromCookie()); } else { return(GetRolesAndSetCookie()); } } else { // not current user or not authenticated if ((siteSettings != null) && (userName != null) && (userName.Length > 0)) { return(SiteUser.GetRoles(siteSettings, userName)); } } } return(new string[0]); }
/// <summary> /// required implementation /// </summary> /// <param name="username">a username</param> /// <returns>a list of roles</returns> public override string[] GetRolesForUser(string userName) { if (HttpContext.Current != null) { SiteSettings siteSettings = CacheHelper.GetCurrentSiteSettings(); string roleCookieName = SiteUtils.GetRoleCookieName(siteSettings); if ((HttpContext.Current.Request.IsAuthenticated) && (HttpContext.Current.User.Identity.Name == userName) && (siteSettings != null) ) { if ( (CookieHelper.CookieExists(roleCookieName)) && (CookieHelper.GetCookieValue(roleCookieName).Length > 0) ) { try { return(GetRolesFromCookie()); // the below errors are expected if the machine key has been changed and the user already has a role cookie // apparently the update for http://weblogs.asp.net/scottgu/archive/2010/09/28/asp-net-security-update-now-available.aspx // changed it from throwing a CryptographyException to an HttpException } catch (System.Security.Cryptography.CryptographicException) { return(GetRolesAndSetCookie()); } catch (HttpException) { return(GetRolesAndSetCookie()); } catch (NullReferenceException ex) { // https://www.mojoportal.com/Forums/Thread.aspx?thread=9515&mid=34&pageid=5&ItemID=2&pagenumber=1#post39505 // not sure what is null here but someone reported it happening using the Amazon silk browser // which does some very weird things like caching everything on their own servers // so their servers make the web request and the brwoser gets it from their server // its like a strange proxy server // then it happened on my own site after applying a windows update log.Error("handled exception", ex); return(GetRolesAndSetCookie()); } } else { return(GetRolesAndSetCookie()); } } else { // not current user or not authenticated if ((siteSettings != null) && (userName != null) && (userName.Length > 0)) { return(SiteUser.GetRoles(siteSettings, userName)); } } } return(new string[0]); }