Исключение безопасности ASP.NET с OpenWebConfiguration на общем хосте - PullRequest
2 голосов
/ 13 октября 2010

После перемещения моего веб-сайта из локальной среды разработки на общий хост я получаю:

Security Exception 

Description: The application attempted to perform an operation not allowed by 
the security policy.  To grant this application the required permission please
contact your system administrator or change the application's trust level in 
the configuration file.

Проблема возникает в моем веб-приложении везде, где вызывается следующее:

WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath)

Поскольку мое веб-приложение только пытается открыть свой собственный файл web.config, я не знаю, почему это помечено как исключение безопасности.Может быть, кто-то может объяснить ... Но что более важно, мне нужно решение, пара решений, которые я нашел через Google, болезненна.

В одном решении (из многочисленных публикаций) сказано, что для настройки уровня доверия установлено значение Полный, но я 'Мне сказали, что это невозможно на моем общем хосте.

Другое решение (от http://www.4guysfromrolla.com/articles/100307-1.aspx) говорит, что не следует использовать OpenWebConfiguration (), но мне нужно использовать его для шифрования разделов конфигурации (например, connectionStrings) с помощьюDPAPI (для получения дополнительной информации см. http://www.4guysfromrolla.com/articles/021506-1.aspx).

. Посоветуйте, пожалуйста, почему IIS barfs в моем веб-приложении пытается открыть собственный web.config и способ обхода, чтобы иметь возможность шифровать части web.configиспользуя DPAPI.

1 Ответ

0 голосов
/ 14 октября 2010

У меня был опыт этой проблемы в прошлом.Метод OpenWebConfiguration() также читает файл machine.config.При частичном доверии и без правильных разрешений вы не можете использовать этот метод.

Если вы вступили в сборки .NET Framework с отладчиком в Visual Studio 2008/2010, вы можете точно увидеть, что происходит.

Ниже приведен стек вызовов, перехваченный при входе в WebConfigurationManager.OpenWebConfiguration():

mscorlib.dll!System.IO.FileStream.Init(string path = "C:\\Windows\\Microsoft.NET\\Framework\\v2.0.50727\\Config\\machine.config", System.IO.FileMode mode = Open, System.IO.FileAccess access = Read, int rights = 0, bool useRights = false, System.IO.FileShare share = Read, int bufferSize = 4096, System.IO.FileOptions options = None, Microsoft.Win32.Win32Native.SECURITY_ATTRIBUTES secAttrs = null, string msgPath = "machine.config", bool bFromProxy = false) Line 326 C#

mscorlib.dll!System.IO.FileStream.FileStream(string path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share) Line 259 C#

System.Configuration.dll!System.Configuration.Internal.InternalConfigHost.StaticOpenStreamForRead(string streamName) + 0x56 bytes 

System.Configuration.dll!System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IInternalConfigHost.OpenStreamForRead(string streamName, bool assertPermissions) + 0x7d bytes 

System.Configuration.dll!System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IInternalConfigHost.OpenStreamForRead(string streamName) + 0xb bytes 

System.Configuration.dll!System.Configuration.Internal.DelegatingConfigHost.OpenStreamForRead(string streamName) + 0xe bytes 

System.Configuration.dll!System.Configuration.UpdateConfigHost.OpenStreamForRead(string streamName) + 0x2f bytes 

System.Configuration.dll!System.Configuration.BaseConfigurationRecord.InitConfigFromFile() + 0x126 bytes 

System.Configuration.dll!System.Configuration.BaseConfigurationRecord.Init(System.Configuration.Internal.IInternalConfigRoot configRoot, System.Configuration.BaseConfigurationRecord parent, string configPath, string locationSubPath) + 0xaa5 bytes 

System.Configuration.dll!System.Configuration.MgmtConfigurationRecord.Init(System.Configuration.Internal.IInternalConfigRoot configRoot, System.Configuration.Internal.IInternalConfigRecord parent, string configPath, string locationSubPath) + 0x39 bytes 

System.Configuration.dll!System.Configuration.MgmtConfigurationRecord.Create(System.Configuration.Internal.IInternalConfigRoot configRoot, System.Configuration.Internal.IInternalConfigRecord parent, string configPath, string locationSubPath) + 0x2a bytes 

System.Configuration.dll!System.Configuration.Internal.InternalConfigRoot.GetConfigRecord(string configPath) + 0x12d bytes 

System.Configuration.dll!System.Configuration.Configuration.Configuration(string locationSubPath, System.Type typeConfigHost, object[] hostInitConfigurationParams) + 0xfd bytes 

System.Configuration.dll!System.Configuration.Internal.InternalConfigConfigurationFactory.System.Configuration.Internal.IInternalConfigConfigurationFactory.Create(System.Type typeConfigHost, object[] hostInitConfigurationParams) + 0x1e bytes 

System.Web.dll!System.Web.Configuration.WebConfigurationHost.OpenConfiguration(System.Web.Configuration.WebLevel webLevel, System.Configuration.ConfigurationFileMap fileMap, System.Web.VirtualPath path, string site, string locationSubPath, string server, string userName, string password, System.IntPtr tokenHandle) Line 862 C#

System.Web.dll!System.Web.Configuration.WebConfigurationManager.OpenWebConfigurationImpl(System.Web.Configuration.WebLevel webLevel, System.Configuration.ConfigurationFileMap fileMap, string path, string site, string locationSubPath, string server, string userName, string password, System.IntPtr userToken) Line 77 + 0x1c bytes C#

System.Web.dll!System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(string path) Line 140 + 0x25 bytes C#

К сожалению, ваша единственная альтернатива - использовать WebConfigurationManager.GetSection(), который не настолько богатый набор функций.

Что касается шифрования ваших строк подключения.К сожалению, эта функция требует полного доверия, другого пути нет.

...