Приложение .NET 4.0 в общей сетевой папке вызывает SecurityException

Сегодня у меня возникла странная проблема при попытке удаленно отладить приложение, созданное для среды выполнения .NET 4.0.

Приложение находится в общей сетевой папке и выполняется на удаленном компьютере. Однако приложение вылетает каждый раз во время загрузки из-за SecurityException, вызванного требованием разрешения в методе System.Configuration.ConfigurationManager.GetSection (). Я не проверял, вызывают ли другие требования разрешений в библиотеке базовых классов также исключение безопасности, но во всех случаях этого не должно происходить с новой средой CLR.

Приложение работает с полным доверием (проверено во время отладки, и, как обычно, это всегда должно быть верно для приложений интрасети в CLR 4.0), поэтому я не понимаю, как запрос разрешения может вызвать исключение в этом случае. При построении для среды выполнения 3.5 SP1 (которая по умолчанию впервые ввела полное доверие для общих сетевых приложений) все работает, как ожидалось.

Я вставил пример кода ниже. Любая помощь приветствуется.

using System;
using System.Configuration;

namespace ConsoleApplication1
{
public sealed class AssetsSection : ConfigurationSection
{
    private static readonly ConfigurationProperty           s_propPath;
    private static readonly ConfigurationPropertyCollection s_properties;

    static AssetsSection()
    {
        s_propPath = new ConfigurationProperty("path", typeof(String));

        s_properties = new ConfigurationPropertyCollection()
        {
            s_propPath
        };
    }

    public static AssetsSection Get()
    {
        return (AssetsSection) ConfigurationManager.GetSection("test/assets");
    }

    protected override ConfigurationPropertyCollection Properties
    {
        get
        {
            return s_properties;
        }
    }

    public String Path
    {
        get
        {
            return (String) base[s_propPath];
        }
        set
        {
            base[s_propPath] = value;
        }
    }
}

class Program
{
    static void Main(String[] args)
    {
        Console.WriteLine(AssetsSection.Get().Path);

        Console.ReadLine();
    }
}
}

И файл App.config;

<?xml version="1.0"?>
<configuration>
<configSections>
    <sectionGroup name="test">
        <section name="assets" type="ConsoleApplication1.AssetsSection, ConsoleApplication1"/>
    </sectionGroup>
</configSections>

<startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/>
</startup>

<test>
    <assets path="..\Assets"/>
</test>
</configuration>

person David    schedule 27.04.2010    source источник
comment
Почему вы делаете сборку для .NET 4.0, но заставляете ее запускать старую версию CLR?   -  person Hans Passant    schedule 28.04.2010
comment
Извините, я вставил неправильный файл конфигурации из своего тестового кода. Редактировал вопрос. Однако проблема, конечно же, остается.   -  person David    schedule 28.04.2010


Ответы (4)


Попробуйте сначала загрузить конфигурацию и откройте соответствующий раздел:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
AssetsSection configSection = (AssetsSection)config.GetSection("test/assets");

Я столкнулся с той же проблемой с .NET 4, и это работает для меня.

person Timo Kuper    schedule 10.05.2010
comment
Большое спасибо, Тимо. У меня это тоже сработало. Но я предполагаю, что это ошибка .NET 4.0. - person David; 24.05.2010
comment
Обратите внимание, что, хотя это работает вокруг исключения, существует проблема с производительностью: десериализованный xml НЕ кэшируется и происходит каждый раз, когда вы вызываете OpenExeConfiguration (). Правильный (ошибочный) способ использования GetSection () кэширует XML раздела и повторно использует его в вызовах подпоследовательности. Это может или не может повлиять на производительность вашего приложения, в зависимости от того, насколько оно чувствительно к производительности и как часто вы выполняете вызовы OpenExeConfiguration. - person galaktor; 28.04.2011

Это связано с известной ошибкой в ​​.NET 4.0 при запуске приложения из общего сетевого ресурса.

В следующем коде возникает ошибка SecurityException. Обратите внимание, что это не удается, только если вы определили пользовательский тип для раздела, как в этом примере AssetsSection:

ConfigurationManager.GetSection("test/assets");

Одно из исправлений - это предложение Тимо использовать другой API. Другое решение - применить исправление, предоставленное Microsoft.

Ошибка и соответствующее исправление зарегистрированы в разделе KB2580188.

person Bhavesh    schedule 27.11.2012

Если вы добавите свой собственный класс для сопоставления раздела следующим образом:

[XmlRoot("Interface")]
public class MySectionClass
{
    [XmlAttribute()]
    public string MyAttr1
    {
        get;
        set;
    }

    public string MyAttr2
    {
        get;
        set;
    }
}

Вы можете использовать этот код:

ConfigurationSection configSection = 
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).
GetSection("MySection");

XmlSerializer xs = new XmlSerializer(typeof(MySectionClass));

XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(configSection.SectionInformation.GetRawXml());

XmlNodeReader xnr = new XmlNodeReader(xdoc.DocumentElement);

MySectionClass section = (MySectionClass)xs.Deserialize(xnr);
person Jenzo    schedule 03.01.2012

Я предполагаю здесь, но подозреваю, что это ваш файл конфигурации, которому не доверяют.

В вашем случае ваш файл конфигурации ссылается на тип ConsoleApplication1.AssetsSection, у которого нет строгого имени, которое можно было бы использовать в качестве доказательства.

Не могли бы вы предоставить более подробную информацию и точное сообщение об ошибке.

person Joe    schedule 05.05.2010
comment
У меня та же проблема, конфигурация моего приложения выглядит так, и у меня все еще есть проблема ‹section name = AuthenticationSection type = Cnbv.Sait.Configuration.AuthenticationConfigurationSection, Cnbv.Sait.Configuration, Version = 4.0.12.0, Culture = нейтральный, PublicKeyToken = 51d456dd8a5ff4be requirePermission = false / › - person Juan Zamudio; 15.10.2010