|
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------
namespace System.ServiceModel.Activation
{
using System.Reflection;
using System.Runtime;
using System.Runtime.CompilerServices;
using System.ServiceModel;
using System.Web.Security;
// Note: The helper provides utility in safe access of System.Web methods for both client and extended SKUs.
static class SystemWebHelper
{
static Type typeOfRoles;
static Type typeOfMembership;
static Type typeOfWebContext;
static bool defaultRoleProviderSet;
static RoleProvider defaultRoleProvider;
static Type TypeOfRoles
{
get
{
if (typeOfRoles == null)
{
typeOfRoles = GetSystemWebType("System.Web.Security.Roles");
}
return typeOfRoles;
}
}
static Type TypeOfMembership
{
get
{
if (typeOfMembership == null)
{
typeOfMembership = GetSystemWebType("System.Web.Security.Membership");
}
return typeOfMembership;
}
}
static Type TypeOfWebContext
{
get
{
if (typeOfWebContext == null)
{
typeOfWebContext = GetSystemWebType("System.Web.Configuration.WebContext");
}
return typeOfWebContext;
}
}
static Type GetSystemWebType(string typeName)
{
#pragma warning disable 436
return Type.GetType(typeName + ", " + AssemblyRef.SystemWeb, false);
#pragma warning restore 436
}
// Invoke for System.Web.Security.Roles.Enabled ? System.Web.Security.Roles.Provider : null
internal static RoleProvider GetDefaultRoleProvider()
{
if (defaultRoleProviderSet)
{
return defaultRoleProvider;
}
Type roleType = TypeOfRoles;
RoleProvider result = null;
if (roleType != null)
{
// Running on extended sku
try
{
PropertyInfo rolesEnabledPropertyInfo = roleType.GetProperty("Enabled");
Fx.Assert(rolesEnabledPropertyInfo != null, "rolesEnabledPropertyInfo must not be null!");
if (((bool)rolesEnabledPropertyInfo.GetValue(null, null)) == true)
{
PropertyInfo rolesProviderPropertyInfo = roleType.GetProperty("Provider");
Fx.Assert(rolesProviderPropertyInfo != null, "rolesProviderPropertyInfo must not be null!");
result = rolesProviderPropertyInfo.GetValue(null, null) as RoleProvider;
}
}
catch (TargetInvocationException exception)
{
// Since reflection invoke always throws TargetInvocationException,
// we need to (best effort) maintain the exception contract by rethrow inner exception.
if (exception.InnerException != null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(exception.InnerException);
}
throw;
}
}
else
{
// Running in client SKU
// This is consistent with no provider
}
defaultRoleProvider = result;
defaultRoleProviderSet = true;
return result;
}
// Invoke for System.Web.Security.Roles.Providers[roleProviderName]
internal static RoleProvider GetRoleProvider(string roleProviderName)
{
Type roleType = TypeOfRoles;
if (roleType != null)
{
try
{
// Running on extended sku
PropertyInfo roleProvidersPropertyInfo = roleType.GetProperty("Providers");
Fx.Assert(roleProvidersPropertyInfo != null, "roleProvidersPropertyInfo must not be null!");
// This could throw if RoleManager is not enabled.
object roleProviderCollection = roleProvidersPropertyInfo.GetValue(null, null);
Fx.Assert(roleProviderCollection != null, "roleProviderCollection must not be null!");
PropertyInfo itemPropertyInfo = roleProviderCollection.GetType().GetProperty("Item", new Type[] { typeof(string) });
Fx.Assert(itemPropertyInfo != null, "itemPropertyInfo must not be null!");
return (RoleProvider)itemPropertyInfo.GetValue(roleProviderCollection, new object[] { roleProviderName });
}
catch (TargetInvocationException exception)
{
// Since reflection invoke always throws TargetInvocationException,
// we need to (best effort) maintain the exception contract by rethrow inner exception.
if (exception.InnerException != null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(exception.InnerException);
}
throw;
}
}
// Running in client SKU
// This is consistent with no provider is a given name.
return null;
}
// Invoke for System.Web.Security.Membership.Provider
internal static MembershipProvider GetMembershipProvider()
{
Type membershipType = TypeOfMembership;
if (membershipType != null)
{
try
{
PropertyInfo membershipProviderPropertyInfo = membershipType.GetProperty("Provider");
Fx.Assert(membershipProviderPropertyInfo != null, "membershipProviderPropertyInfo must not be null!");
return (MembershipProvider)membershipProviderPropertyInfo.GetValue(null, null);
}
catch (TargetInvocationException exception)
{
// Since reflection invoke always throws TargetInvocationException,
// we need to (best effort) maintain the exception contract by rethrow inner exception.
if (exception.InnerException != null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(exception.InnerException);
}
throw;
}
}
// Running in client SKU
// This is consistent with no default provider.
return null;
}
// Invoke for System.Web.Security.Membership.Providers[membershipProviderName]
internal static MembershipProvider GetMembershipProvider(string membershipProviderName)
{
Type membershipType = TypeOfMembership;
if (membershipType != null)
{
try
{
PropertyInfo membershipProvidersPropertyInfo = membershipType.GetProperty("Providers");
Fx.Assert(membershipProvidersPropertyInfo != null, "membershipProvidersPropertyInfo must not be null!");
object membershipProviderCollection = membershipProvidersPropertyInfo.GetValue(null, null);
Fx.Assert(membershipProviderCollection != null, "membershipProviderCollection must not be null!");
PropertyInfo itemPropertyInfo = membershipProviderCollection.GetType().GetProperty("Item", new Type[] { typeof(string) });
Fx.Assert(itemPropertyInfo != null, "itemPropertyInfo must not be null!");
return (MembershipProvider)itemPropertyInfo.GetValue(membershipProviderCollection, new object[] { membershipProviderName });
}
catch (TargetInvocationException exception)
{
// Since reflection invoke always throws TargetInvocationException,
// we need to (best effort) maintain the exception contract by rethrow inner exception.
if (exception.InnerException != null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(exception.InnerException);
}
throw;
}
}
// Running in client SKU
// This is consistent with no provider is a given name.
return null;
}
// check if ((System.Web.Configuration.WebContext)configHostingContext).ApplicationLevel == WebApplicationLevel.AboveApplication
internal static bool IsWebConfigAboveApplication(object configHostingContext)
{
Type webContextType = TypeOfWebContext;
if (configHostingContext == null
|| webContextType == null
|| configHostingContext.GetType() != webContextType)
{
// if we don't recognize the context we can't enforce the special web.config logic
return false;
}
const int webApplicationLevelAboveApplication = 10; // public value of the enum
Fx.Assert(GetSystemWebType("System.Web.Configuration.WebApplicationLevel") != null, "Type 'System.Web.Configuration.WebApplicationLevel' MUST exist in System.Web.dll.");
Fx.Assert(GetSystemWebType("System.Web.Configuration.WebApplicationLevel").GetProperty("AboveApplication") == null ||
(int)GetSystemWebType("System.Web.Configuration.WebApplicationLevel").GetProperty("AboveApplication").GetValue(null, null) == webApplicationLevelAboveApplication,
"unexpected property value");
try
{
PropertyInfo applicationLevelPropertyInfo = webContextType.GetProperty("ApplicationLevel");
Fx.Assert(applicationLevelPropertyInfo != null, "applicationLevelPropertyInfo must not be null!");
return (int)applicationLevelPropertyInfo.GetValue(configHostingContext, null) == webApplicationLevelAboveApplication;
}
catch (TargetInvocationException exception)
{
// Since reflection invoke always throws TargetInvocationException,
// we need to (best effort) maintain the exception contract by rethrow inner exception.
if (exception.InnerException != null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(exception.InnerException);
}
throw;
}
}
}
}
|