Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / ndp / fx / src / xsp / System / Web / Extensions / ClientServices / Providers / ClientRoleProvider.cs / 1 / ClientRoleProvider.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Web.ClientServices.Providers { using System; using System.Web.Security; using System.Threading; using System.Security.Principal; using System.Data; using System.Data.OleDb; using System.IO; using System.Windows.Forms; using System.Collections.Specialized; using System.Net; using System.Web.ClientServices; using System.Web.Resources; using System.Configuration; using System.Globalization; using System.Collections; using System.Text; using System.Runtime.InteropServices; using System.Data.Common; using System.Security; using System.Security.Permissions; using System.Security.AccessControl; using System.Diagnostics.CodeAnalysis; public class ClientRoleProvider : RoleProvider { private string _ConnectionString = null; private string _ConnectionStringProvider = null; private string _ServiceUri = null; private string[] _Roles = null; private string _CurrentUser = null; private int _CacheTimeout = 1440; // 1 day in minutes private DateTime _CacheExpiryDate = DateTime.UtcNow; private bool _HonorCookieExpiry = false; private bool _UsingFileSystemStore = false; private bool _UsingIsolatedStore = false; private bool _UsingWFCService = false; ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// public override void Initialize(string name, NameValueCollection config) { if (config == null) throw new ArgumentNullException("config"); base.Initialize(name, config); ServiceUri = config["serviceUri"]; string temp = config["cacheTimeout"]; if (!string.IsNullOrEmpty(temp)) _CacheTimeout = int.Parse(temp, CultureInfo.InvariantCulture); _ConnectionString = config["connectionStringName"]; if (string.IsNullOrEmpty(_ConnectionString)) { _ConnectionString = SqlHelper.GetDefaultConnectionString(); } else { if (ConfigurationManager.ConnectionStrings[_ConnectionString] != null) { _ConnectionStringProvider = ConfigurationManager.ConnectionStrings[_ConnectionString].ProviderName; _ConnectionString = ConfigurationManager.ConnectionStrings[_ConnectionString].ConnectionString; } } switch(SqlHelper.IsSpecialConnectionString(_ConnectionString)) { case 1: _UsingFileSystemStore = true; break; case 2: _UsingIsolatedStore = true; break; default: break; } temp = config["honorCookieExpiry"]; if (!string.IsNullOrEmpty(temp)) _HonorCookieExpiry = (string.Compare(temp, "true", StringComparison.OrdinalIgnoreCase) == 0); config.Remove("name"); config.Remove("description"); config.Remove("cacheTimeout"); config.Remove("connectionStringName"); config.Remove("serviceUri"); config.Remove("honorCookieExpiry"); foreach (string attribUnrecognized in config.Keys) if (!String.IsNullOrEmpty(attribUnrecognized)) throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, AtlasWeb.AttributeNotRecognized, attribUnrecognized)); } ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// public override bool IsUserInRole(string username, string roleName) { string[] roles = GetRolesForUser(username); foreach (string role in roles) if (string.Compare(role, roleName, StringComparison.OrdinalIgnoreCase) == 0) return true; return false; } ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// public override string[] GetRolesForUser(string username) { lock (this) { IPrincipal p = Thread.CurrentPrincipal; if (p == null || p.Identity == null || !p.Identity.IsAuthenticated) return new string[0]; if (!string.IsNullOrEmpty(username) && string.Compare(username, p.Identity.Name, StringComparison.OrdinalIgnoreCase) != 0) throw new ArgumentException(AtlasWeb.ArgumentMustBeCurrentUser, "username"); // Serve from memory cache if it is for the last-user, and the roles are fresh if (string.Compare(_CurrentUser, p.Identity.Name, StringComparison.OrdinalIgnoreCase) == 0 && DateTime.UtcNow < _CacheExpiryDate) return _Roles; // Fetch from database, cache it, and serve it if (GetRolesFromDBForUser(p.Identity.Name)) // Return true, only if the roles are fresh. Also, sets _CurrentUser, _Roles and _CacheExpiryDate return _Roles; if (ConnectivityStatus.IsOffline) return new string[0]; // Reset variables _Roles = null; _CacheExpiryDate = DateTime.UtcNow; _CurrentUser = p.Identity.Name; GetRolesForUserCore(p.Identity); if (!_HonorCookieExpiry && _Roles.Length < 1 && (p.Identity is ClientFormsIdentity)) { ((ClientFormsIdentity)p.Identity).RevalidateUser(); GetRolesForUserCore(p.Identity); } StoreRolesForCurrentUser(); return _Roles; } } ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// public void ResetCache() { lock (this){ _Roles = null; _CacheExpiryDate = DateTime.UtcNow; RemoveRolesFromDB(); } } ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// // Private methods [SuppressMessage("Microsoft.Security", "CA2116:AptcaMethodsShouldOnlyCallAptcaMethods", Justification="Reviewed and approved by feature crew")] private void GetRolesForUserCore(IIdentity identity) { // (new PermissionSet(PermissionState.Unrestricted)).Assert(); // CookieContainer cookies = null; if (identity is ClientFormsIdentity) cookies = ((ClientFormsIdentity)identity).AuthenticationCookies; if (_UsingWFCService) { throw new NotImplementedException(); // CustomBinding binding = ProxyHelper.GetBinding(); // ChannelFactorychannelFactory = new ChannelFactory (binding, new EndpointAddress(GetServiceUri())); //(@"http://localhost/AuthSvc/service.svc")); // RolesService clientService = channelFactory.CreateChannel(); // using (new OperationContextScope((IContextChannel)clientService)) { // ProxyHelper.AddCookiesToWCF(cookies, GetServiceUri(), _CurrentUser, _ConnectionString, _ConnectionStringProvider); // _Roles = clientService.GetRolesForCurrentUser(); // if (_Roles == null) // _Roles = new string[0]; // ProxyHelper.GetCookiesFromWCF(cookies, GetServiceUri(), _CurrentUser, _ConnectionString, _ConnectionStringProvider); // } } else { object o = ProxyHelper.CreateWebRequestAndGetResponse(GetServiceUri() + "/GetRolesForCurrentUser", ref cookies, identity.Name, _ConnectionString, _ConnectionStringProvider, null, null, typeof(string [])); if (o != null) _Roles = (string []) o; else _Roles = new string[0]; } _CacheExpiryDate = DateTime.UtcNow.AddMinutes(_CacheTimeout); } ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// private void RemoveRolesFromDB() { // if (MustAssertForSql) // (new PermissionSet(PermissionState.Unrestricted)).Assert(); if (string.IsNullOrEmpty(_CurrentUser)) return; if (_UsingFileSystemStore || _UsingIsolatedStore) { ClientData cd = ClientDataManager.GetUserClientData(_CurrentUser, _UsingIsolatedStore); cd.Roles = null; cd.Save(); return; } using (DbConnection conn = SqlHelper.GetConnection(_CurrentUser, _ConnectionString, _ConnectionStringProvider)) { DbTransaction trans = null; try { trans = conn.BeginTransaction(); DbCommand cmd = conn.CreateCommand(); cmd.CommandText = "DELETE FROM Roles WHERE UserName = @UserName"; SqlHelper.AddParameter(conn, cmd, "@UserName", _CurrentUser); cmd.Transaction = trans; cmd.ExecuteNonQuery(); cmd = conn.CreateCommand(); cmd.CommandText = "DELETE FROM UserProperties WHERE PropertyName = @RolesCachedDate"; SqlHelper.AddParameter(conn, cmd, "@RolesCachedDate", "RolesCachedDate_" + _CurrentUser); cmd.Transaction = trans; cmd.ExecuteNonQuery(); } catch { if (trans != null) { trans.Rollback(); trans = null; } throw; } finally { if (trans != null) trans.Commit(); } } } ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// private void StoreRolesForCurrentUser() { if (_UsingFileSystemStore || _UsingIsolatedStore) { ClientData cd = ClientDataManager.GetUserClientData(_CurrentUser, _UsingIsolatedStore); cd.Roles = _Roles; cd.RolesCachedDateUtc = DateTime.UtcNow; cd.Save(); return; } // if (MustAssertForSql) // (new PermissionSet(PermissionState.Unrestricted)).Assert(); RemoveRolesFromDB(); // Remove all old roles DbTransaction trans = null; using (DbConnection conn = SqlHelper.GetConnection(_CurrentUser, _ConnectionString, _ConnectionStringProvider)) { try { trans = conn.BeginTransaction(); // Add the roles DbCommand cmd = null; foreach(string role in _Roles) { cmd = conn.CreateCommand(); cmd.CommandText = "INSERT INTO Roles(UserName, RoleName) VALUES(@UserName, @RoleName)"; SqlHelper.AddParameter(conn, cmd, "@UserName", _CurrentUser); SqlHelper.AddParameter(conn, cmd, "@RoleName", role); cmd.Transaction = trans; cmd.ExecuteNonQuery(); } cmd = conn.CreateCommand(); cmd.CommandText = "INSERT INTO UserProperties (PropertyName, PropertyValue) VALUES(@RolesCachedDate, @Date)"; SqlHelper.AddParameter(conn, cmd, "@RolesCachedDate", "RolesCachedDate_" + _CurrentUser); SqlHelper.AddParameter(conn, cmd, "@Date", DateTime.UtcNow.ToFileTimeUtc().ToString(CultureInfo.InvariantCulture)); cmd.Transaction = trans; cmd.ExecuteNonQuery(); } catch { if (trans != null) { trans.Rollback(); trans = null; } throw; } finally { if (trans != null) trans.Commit(); } } } ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// private bool GetRolesFromDBForUser(string username) { _Roles = null; _CacheExpiryDate = DateTime.UtcNow; _CurrentUser = username; // if (MustAssertForSql) // (new PermissionSet(PermissionState.Unrestricted)).Assert(); if (_UsingFileSystemStore || _UsingIsolatedStore) { ClientData cd = ClientDataManager.GetUserClientData(username, _UsingIsolatedStore); if (cd.Roles == null) return false; _Roles = cd.Roles; _CacheExpiryDate = cd.RolesCachedDateUtc.AddMinutes(_CacheTimeout); if (!ConnectivityStatus.IsOffline && _CacheExpiryDate < DateTime.UtcNow) // expired roles return false; return true; } using (DbConnection conn = SqlHelper.GetConnection(_CurrentUser, _ConnectionString, _ConnectionStringProvider)) { DbTransaction trans = null; try { trans = conn.BeginTransaction(); DbCommand cmd = conn.CreateCommand(); cmd.Transaction = trans; cmd.CommandText = "SELECT PropertyValue FROM UserProperties WHERE PropertyName = @RolesCachedDate"; SqlHelper.AddParameter(conn, cmd, "@RolesCachedDate", "RolesCachedDate_" + _CurrentUser); string date = cmd.ExecuteScalar() as string; if (date == null) // not cached return false; long filetime = long.Parse(date, CultureInfo.InvariantCulture); _CacheExpiryDate = DateTime.FromFileTimeUtc(filetime).AddMinutes(_CacheTimeout); if (!ConnectivityStatus.IsOffline && _CacheExpiryDate < DateTime.UtcNow) // expired roles return false; cmd = conn.CreateCommand(); cmd.Transaction = trans; cmd.CommandText = "SELECT RoleName FROM Roles WHERE UserName = @UserName ORDER BY RoleName"; SqlHelper.AddParameter(conn, cmd, "@UserName", _CurrentUser); ArrayList al = new ArrayList(); using (DbDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) al.Add(reader.GetString(0)); } _Roles = new string[al.Count]; for (int iter = 0; iter < al.Count; iter++) _Roles[iter] = (string)al[iter]; return true; } catch { if (trans != null) { trans.Rollback(); trans = null; } throw; } finally { if (trans != null) trans.Commit(); } } } ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// private string GetServiceUri() { if (string.IsNullOrEmpty(_ServiceUri)) throw new ArgumentException(AtlasWeb.ServiceUriNotFound); return _ServiceUri; } [SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings", Justification = "Reviewed and approved by feature crew")] public string ServiceUri { [SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings", MessageId = "2#", Justification = "Reviewed and approved by feature crew")] get { return _ServiceUri; } [SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings", MessageId = "2#", Justification = "Reviewed and approved by feature crew")] set { _ServiceUri = value; if (string.IsNullOrEmpty(_ServiceUri)) { _UsingWFCService = false; } else { _UsingWFCService = _ServiceUri.EndsWith(".svc", StringComparison.OrdinalIgnoreCase); } } } ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// // private bool _MustAssertForSqlDecided = false; // private bool _MustAssertForSql = false; // private bool MustAssertForSql { // get { // if (!_MustAssertForSqlDecided) { // _MustAssertForSql = (_ConnectionString == "Data Source = |SQL\\CE|"); // _MustAssertForSqlDecided = true; // } // return _MustAssertForSql; // } // } public override string ApplicationName { get { return ""; } set { } } public override void CreateRole(string roleName) { throw new NotSupportedException(); } public override bool DeleteRole(string roleName, bool throwOnPopulatedRole) { throw new NotSupportedException(); } public override bool RoleExists(string roleName) { throw new NotSupportedException(); } public override void AddUsersToRoles(string[] usernames, string[] roleNames) { throw new NotSupportedException(); } public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames) { throw new NotSupportedException(); } public override string[] GetUsersInRole(string roleName) { throw new NotSupportedException(); } public override string[] GetAllRoles() { throw new NotSupportedException(); } public override string[] FindUsersInRole(string roleName, string usernameToMatch) { throw new NotSupportedException(); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Web.ClientServices.Providers { using System; using System.Web.Security; using System.Threading; using System.Security.Principal; using System.Data; using System.Data.OleDb; using System.IO; using System.Windows.Forms; using System.Collections.Specialized; using System.Net; using System.Web.ClientServices; using System.Web.Resources; using System.Configuration; using System.Globalization; using System.Collections; using System.Text; using System.Runtime.InteropServices; using System.Data.Common; using System.Security; using System.Security.Permissions; using System.Security.AccessControl; using System.Diagnostics.CodeAnalysis; public class ClientRoleProvider : RoleProvider { private string _ConnectionString = null; private string _ConnectionStringProvider = null; private string _ServiceUri = null; private string[] _Roles = null; private string _CurrentUser = null; private int _CacheTimeout = 1440; // 1 day in minutes private DateTime _CacheExpiryDate = DateTime.UtcNow; private bool _HonorCookieExpiry = false; private bool _UsingFileSystemStore = false; private bool _UsingIsolatedStore = false; private bool _UsingWFCService = false; ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// public override void Initialize(string name, NameValueCollection config) { if (config == null) throw new ArgumentNullException("config"); base.Initialize(name, config); ServiceUri = config["serviceUri"]; string temp = config["cacheTimeout"]; if (!string.IsNullOrEmpty(temp)) _CacheTimeout = int.Parse(temp, CultureInfo.InvariantCulture); _ConnectionString = config["connectionStringName"]; if (string.IsNullOrEmpty(_ConnectionString)) { _ConnectionString = SqlHelper.GetDefaultConnectionString(); } else { if (ConfigurationManager.ConnectionStrings[_ConnectionString] != null) { _ConnectionStringProvider = ConfigurationManager.ConnectionStrings[_ConnectionString].ProviderName; _ConnectionString = ConfigurationManager.ConnectionStrings[_ConnectionString].ConnectionString; } } switch(SqlHelper.IsSpecialConnectionString(_ConnectionString)) { case 1: _UsingFileSystemStore = true; break; case 2: _UsingIsolatedStore = true; break; default: break; } temp = config["honorCookieExpiry"]; if (!string.IsNullOrEmpty(temp)) _HonorCookieExpiry = (string.Compare(temp, "true", StringComparison.OrdinalIgnoreCase) == 0); config.Remove("name"); config.Remove("description"); config.Remove("cacheTimeout"); config.Remove("connectionStringName"); config.Remove("serviceUri"); config.Remove("honorCookieExpiry"); foreach (string attribUnrecognized in config.Keys) if (!String.IsNullOrEmpty(attribUnrecognized)) throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, AtlasWeb.AttributeNotRecognized, attribUnrecognized)); } ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// public override bool IsUserInRole(string username, string roleName) { string[] roles = GetRolesForUser(username); foreach (string role in roles) if (string.Compare(role, roleName, StringComparison.OrdinalIgnoreCase) == 0) return true; return false; } ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// public override string[] GetRolesForUser(string username) { lock (this) { IPrincipal p = Thread.CurrentPrincipal; if (p == null || p.Identity == null || !p.Identity.IsAuthenticated) return new string[0]; if (!string.IsNullOrEmpty(username) && string.Compare(username, p.Identity.Name, StringComparison.OrdinalIgnoreCase) != 0) throw new ArgumentException(AtlasWeb.ArgumentMustBeCurrentUser, "username"); // Serve from memory cache if it is for the last-user, and the roles are fresh if (string.Compare(_CurrentUser, p.Identity.Name, StringComparison.OrdinalIgnoreCase) == 0 && DateTime.UtcNow < _CacheExpiryDate) return _Roles; // Fetch from database, cache it, and serve it if (GetRolesFromDBForUser(p.Identity.Name)) // Return true, only if the roles are fresh. Also, sets _CurrentUser, _Roles and _CacheExpiryDate return _Roles; if (ConnectivityStatus.IsOffline) return new string[0]; // Reset variables _Roles = null; _CacheExpiryDate = DateTime.UtcNow; _CurrentUser = p.Identity.Name; GetRolesForUserCore(p.Identity); if (!_HonorCookieExpiry && _Roles.Length < 1 && (p.Identity is ClientFormsIdentity)) { ((ClientFormsIdentity)p.Identity).RevalidateUser(); GetRolesForUserCore(p.Identity); } StoreRolesForCurrentUser(); return _Roles; } } ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// public void ResetCache() { lock (this){ _Roles = null; _CacheExpiryDate = DateTime.UtcNow; RemoveRolesFromDB(); } } ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// // Private methods [SuppressMessage("Microsoft.Security", "CA2116:AptcaMethodsShouldOnlyCallAptcaMethods", Justification="Reviewed and approved by feature crew")] private void GetRolesForUserCore(IIdentity identity) { // (new PermissionSet(PermissionState.Unrestricted)).Assert(); // CookieContainer cookies = null; if (identity is ClientFormsIdentity) cookies = ((ClientFormsIdentity)identity).AuthenticationCookies; if (_UsingWFCService) { throw new NotImplementedException(); // CustomBinding binding = ProxyHelper.GetBinding(); // ChannelFactorychannelFactory = new ChannelFactory (binding, new EndpointAddress(GetServiceUri())); //(@"http://localhost/AuthSvc/service.svc")); // RolesService clientService = channelFactory.CreateChannel(); // using (new OperationContextScope((IContextChannel)clientService)) { // ProxyHelper.AddCookiesToWCF(cookies, GetServiceUri(), _CurrentUser, _ConnectionString, _ConnectionStringProvider); // _Roles = clientService.GetRolesForCurrentUser(); // if (_Roles == null) // _Roles = new string[0]; // ProxyHelper.GetCookiesFromWCF(cookies, GetServiceUri(), _CurrentUser, _ConnectionString, _ConnectionStringProvider); // } } else { object o = ProxyHelper.CreateWebRequestAndGetResponse(GetServiceUri() + "/GetRolesForCurrentUser", ref cookies, identity.Name, _ConnectionString, _ConnectionStringProvider, null, null, typeof(string [])); if (o != null) _Roles = (string []) o; else _Roles = new string[0]; } _CacheExpiryDate = DateTime.UtcNow.AddMinutes(_CacheTimeout); } ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// private void RemoveRolesFromDB() { // if (MustAssertForSql) // (new PermissionSet(PermissionState.Unrestricted)).Assert(); if (string.IsNullOrEmpty(_CurrentUser)) return; if (_UsingFileSystemStore || _UsingIsolatedStore) { ClientData cd = ClientDataManager.GetUserClientData(_CurrentUser, _UsingIsolatedStore); cd.Roles = null; cd.Save(); return; } using (DbConnection conn = SqlHelper.GetConnection(_CurrentUser, _ConnectionString, _ConnectionStringProvider)) { DbTransaction trans = null; try { trans = conn.BeginTransaction(); DbCommand cmd = conn.CreateCommand(); cmd.CommandText = "DELETE FROM Roles WHERE UserName = @UserName"; SqlHelper.AddParameter(conn, cmd, "@UserName", _CurrentUser); cmd.Transaction = trans; cmd.ExecuteNonQuery(); cmd = conn.CreateCommand(); cmd.CommandText = "DELETE FROM UserProperties WHERE PropertyName = @RolesCachedDate"; SqlHelper.AddParameter(conn, cmd, "@RolesCachedDate", "RolesCachedDate_" + _CurrentUser); cmd.Transaction = trans; cmd.ExecuteNonQuery(); } catch { if (trans != null) { trans.Rollback(); trans = null; } throw; } finally { if (trans != null) trans.Commit(); } } } ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// private void StoreRolesForCurrentUser() { if (_UsingFileSystemStore || _UsingIsolatedStore) { ClientData cd = ClientDataManager.GetUserClientData(_CurrentUser, _UsingIsolatedStore); cd.Roles = _Roles; cd.RolesCachedDateUtc = DateTime.UtcNow; cd.Save(); return; } // if (MustAssertForSql) // (new PermissionSet(PermissionState.Unrestricted)).Assert(); RemoveRolesFromDB(); // Remove all old roles DbTransaction trans = null; using (DbConnection conn = SqlHelper.GetConnection(_CurrentUser, _ConnectionString, _ConnectionStringProvider)) { try { trans = conn.BeginTransaction(); // Add the roles DbCommand cmd = null; foreach(string role in _Roles) { cmd = conn.CreateCommand(); cmd.CommandText = "INSERT INTO Roles(UserName, RoleName) VALUES(@UserName, @RoleName)"; SqlHelper.AddParameter(conn, cmd, "@UserName", _CurrentUser); SqlHelper.AddParameter(conn, cmd, "@RoleName", role); cmd.Transaction = trans; cmd.ExecuteNonQuery(); } cmd = conn.CreateCommand(); cmd.CommandText = "INSERT INTO UserProperties (PropertyName, PropertyValue) VALUES(@RolesCachedDate, @Date)"; SqlHelper.AddParameter(conn, cmd, "@RolesCachedDate", "RolesCachedDate_" + _CurrentUser); SqlHelper.AddParameter(conn, cmd, "@Date", DateTime.UtcNow.ToFileTimeUtc().ToString(CultureInfo.InvariantCulture)); cmd.Transaction = trans; cmd.ExecuteNonQuery(); } catch { if (trans != null) { trans.Rollback(); trans = null; } throw; } finally { if (trans != null) trans.Commit(); } } } ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// private bool GetRolesFromDBForUser(string username) { _Roles = null; _CacheExpiryDate = DateTime.UtcNow; _CurrentUser = username; // if (MustAssertForSql) // (new PermissionSet(PermissionState.Unrestricted)).Assert(); if (_UsingFileSystemStore || _UsingIsolatedStore) { ClientData cd = ClientDataManager.GetUserClientData(username, _UsingIsolatedStore); if (cd.Roles == null) return false; _Roles = cd.Roles; _CacheExpiryDate = cd.RolesCachedDateUtc.AddMinutes(_CacheTimeout); if (!ConnectivityStatus.IsOffline && _CacheExpiryDate < DateTime.UtcNow) // expired roles return false; return true; } using (DbConnection conn = SqlHelper.GetConnection(_CurrentUser, _ConnectionString, _ConnectionStringProvider)) { DbTransaction trans = null; try { trans = conn.BeginTransaction(); DbCommand cmd = conn.CreateCommand(); cmd.Transaction = trans; cmd.CommandText = "SELECT PropertyValue FROM UserProperties WHERE PropertyName = @RolesCachedDate"; SqlHelper.AddParameter(conn, cmd, "@RolesCachedDate", "RolesCachedDate_" + _CurrentUser); string date = cmd.ExecuteScalar() as string; if (date == null) // not cached return false; long filetime = long.Parse(date, CultureInfo.InvariantCulture); _CacheExpiryDate = DateTime.FromFileTimeUtc(filetime).AddMinutes(_CacheTimeout); if (!ConnectivityStatus.IsOffline && _CacheExpiryDate < DateTime.UtcNow) // expired roles return false; cmd = conn.CreateCommand(); cmd.Transaction = trans; cmd.CommandText = "SELECT RoleName FROM Roles WHERE UserName = @UserName ORDER BY RoleName"; SqlHelper.AddParameter(conn, cmd, "@UserName", _CurrentUser); ArrayList al = new ArrayList(); using (DbDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) al.Add(reader.GetString(0)); } _Roles = new string[al.Count]; for (int iter = 0; iter < al.Count; iter++) _Roles[iter] = (string)al[iter]; return true; } catch { if (trans != null) { trans.Rollback(); trans = null; } throw; } finally { if (trans != null) trans.Commit(); } } } ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// private string GetServiceUri() { if (string.IsNullOrEmpty(_ServiceUri)) throw new ArgumentException(AtlasWeb.ServiceUriNotFound); return _ServiceUri; } [SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings", Justification = "Reviewed and approved by feature crew")] public string ServiceUri { [SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings", MessageId = "2#", Justification = "Reviewed and approved by feature crew")] get { return _ServiceUri; } [SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings", MessageId = "2#", Justification = "Reviewed and approved by feature crew")] set { _ServiceUri = value; if (string.IsNullOrEmpty(_ServiceUri)) { _UsingWFCService = false; } else { _UsingWFCService = _ServiceUri.EndsWith(".svc", StringComparison.OrdinalIgnoreCase); } } } ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// // private bool _MustAssertForSqlDecided = false; // private bool _MustAssertForSql = false; // private bool MustAssertForSql { // get { // if (!_MustAssertForSqlDecided) { // _MustAssertForSql = (_ConnectionString == "Data Source = |SQL\\CE|"); // _MustAssertForSqlDecided = true; // } // return _MustAssertForSql; // } // } public override string ApplicationName { get { return ""; } set { } } public override void CreateRole(string roleName) { throw new NotSupportedException(); } public override bool DeleteRole(string roleName, bool throwOnPopulatedRole) { throw new NotSupportedException(); } public override bool RoleExists(string roleName) { throw new NotSupportedException(); } public override void AddUsersToRoles(string[] usernames, string[] roleNames) { throw new NotSupportedException(); } public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames) { throw new NotSupportedException(); } public override string[] GetUsersInRole(string roleName) { throw new NotSupportedException(); } public override string[] GetAllRoles() { throw new NotSupportedException(); } public override string[] FindUsersInRole(string roleName, string usernameToMatch) { throw new NotSupportedException(); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- RemoveStoryboard.cs
- RegionData.cs
- HScrollProperties.cs
- TableNameAttribute.cs
- ClientRolePrincipal.cs
- DataGridViewLinkCell.cs
- RoleService.cs
- FloaterBaseParaClient.cs
- KnownTypesProvider.cs
- TextDecorationCollection.cs
- DrawingAttributesDefaultValueFactory.cs
- DescriptionAttribute.cs
- DigitShape.cs
- PagesChangedEventArgs.cs
- XmlTypeAttribute.cs
- AccessibleObject.cs
- Dictionary.cs
- NonClientArea.cs
- SemaphoreSlim.cs
- SQLByteStorage.cs
- RuntimeEnvironment.cs
- SerialErrors.cs
- XomlDesignerLoader.cs
- DataGridClipboardHelper.cs
- ToolStripPanelSelectionBehavior.cs
- SqlInternalConnection.cs
- Number.cs
- TextFormatter.cs
- DynamicResourceExtension.cs
- DataColumnCollection.cs
- CompilerTypeWithParams.cs
- EnumValAlphaComparer.cs
- WsatRegistrationHeader.cs
- Filter.cs
- QueueAccessMode.cs
- EventMap.cs
- MethodBuilder.cs
- EdmToObjectNamespaceMap.cs
- Stack.cs
- XPathAxisIterator.cs
- Relationship.cs
- HttpProfileBase.cs
- SchemaReference.cs
- XmlSchemaSimpleType.cs
- AssociationEndMember.cs
- TextParentUndoUnit.cs
- XmlRootAttribute.cs
- SqlCaseSimplifier.cs
- BypassElement.cs
- GatewayDefinition.cs
- Mouse.cs
- GatewayDefinition.cs
- XmlSchemaSubstitutionGroup.cs
- RelatedImageListAttribute.cs
- QueryableDataSourceView.cs
- XMLDiffLoader.cs
- RightsManagementInformation.cs
- Soap12ServerProtocol.cs
- CursorInteropHelper.cs
- Style.cs
- WebPartExportVerb.cs
- Missing.cs
- DrawingCollection.cs
- Attributes.cs
- TextParaLineResult.cs
- _Rfc2616CacheValidators.cs
- AppDomainFactory.cs
- EraserBehavior.cs
- TextHidden.cs
- DataControlField.cs
- DatePickerTextBox.cs
- RadialGradientBrush.cs
- BatchServiceHost.cs
- HandledEventArgs.cs
- RegistrationServices.cs
- TaskHelper.cs
- cryptoapiTransform.cs
- ProfileBuildProvider.cs
- SystemThemeKey.cs
- xmlformatgeneratorstatics.cs
- BidOverLoads.cs
- RegistryKey.cs
- typedescriptorpermissionattribute.cs
- Section.cs
- DataGridViewRowCancelEventArgs.cs
- TextDecorationLocationValidation.cs
- ObjectSecurity.cs
- ClockGroup.cs
- DropShadowEffect.cs
- LicenseProviderAttribute.cs
- PipelineComponent.cs
- ConfigurationStrings.cs
- ThicknessAnimationUsingKeyFrames.cs
- RuntimeCompatibilityAttribute.cs
- Attributes.cs
- BlurEffect.cs
- DriveInfo.cs
- FrameworkElement.cs
- CompilerError.cs
- Convert.cs