Недавно напоролись на один древний баг в ASP.NET Membership. Краткий смысл бага – бросание исключения при инициализации провайдера Membership уводит весь Membership в нерабочее состояние.

Полный смысл бага:

Вот код статического метода System.Web.Security.Membership.Initialize(), который вызывается при любых обращениях к методам ProviderBase:

private static void Initialize()
{
    if (!s_Initialized || !s_InitializedDefaultProvider)
    {
        if (s_InitializeException != null)
        {
            throw s_InitializeException;
        }
        if (HostingEnvironment.IsHosted)
        {
            HttpRuntime.CheckAspNetHostingPermission(AspNetHostingPermissionLevel.Low, "Feature_not_supported_at_this_level");
        }
        lock (s_lock)
        {
            if (!s_Initialized || !s_InitializedDefaultProvider)
            {
                if (s_InitializeException != null)
                {
                    throw s_InitializeException;
                }
                bool initializeGeneralSettings = !s_Initialized;
                bool initializeDefaultProvider = !s_InitializedDefaultProvider
                    && (!HostingEnvironment.IsHosted || (BuildManager.PreStartInitStage == PreStartInitStage.AfterPreStartInit));
                if (initializeDefaultProvider || initializeGeneralSettings)
                {
                    bool flag3;
                    bool flag4 = false;
                    try
                    {
                        RuntimeConfig appConfig = RuntimeConfig.GetAppConfig();
                        MembershipSection membership = appConfig.Membership;
                        flag3 = InitializeSettings(initializeGeneralSettings, appConfig, membership);
                        flag4 = InitializeDefaultProvider(initializeDefaultProvider, membership);
                    }
                    catch (Exception exception)
                    {
                        s_InitializeException = exception;
                        throw;
                    }
                    if (flag3)
                    {
                        s_Initialized = true;
                    }
                    if (flag4)
                    {
                        s_InitializedDefaultProvider = true;
                    }
                }
            }
        }
    }
}

Во втором ASP.NET баг осложняется еще и тем, что стандартная реализация ProvidersHelper.InstantiateProvider проглатывает оригинальные исключения и оборачивает их в ConfigurationErrorsException, сохраняя лишь текст сообщения

Не используйте Membership. А если используете – не бросайте исключения при инициализации своих провадеров.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>