Как изменить FormsCookieName во время выполнения в ASP.NET - PullRequest
5 голосов
/ 05 ноября 2008

Мы хотели бы, чтобы FormsCookieName FormsCookiePath изменялось для каждого экземпляра нашего приложения. У нас есть приложение, которое имеет несколько экземпляров на 1 имя сервера / домена. Из-за этого мы можем работать только в 1 приложении одновременно, так как куки будут перезаписывать друг друга. То же самое для сессий между прочим.

Есть ли способ динамически, например, в Global.asax Application_Start, изменить это имя? Это было бы полезно, так как мы сохраняем имя лицензии в каждом приложении, которое можно использовать в качестве основы для CookieName.

Мы уже работаем с Web.config и дополнительными файлами для перезаписи значений Web.config во внешних файлах, используя: <appSettings file="Web.AppSettings.Config">

Но это требует ручных действий, которые могут быть забыты и излишни, так как настройки могут быть получены из базы данных.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 09 апреля 2011

У меня была похожая ситуация, я сделал следующее. В Application_Start я проверил, нужно ли изменить имя моего файла cookie. Это произойдет после нового развертывания для всех приложений, где у меня будет один и тот же web.config для всех.

<code>
protected void Application_Start(object sender, EventArgs e)
{
  // determine unique cookie name per application
  string cookieName = ...
  // Get the web.config forms settings
  Configuration c = WebConfigurationManager.OpenWebConfiguration("~");
  AuthenticationSection auth = c.GetSection("system.web/authentication") 
        as AuthenticationSection;
  // See if we have mismatch in web.config or in Forms cookiename
  if (auth != null && auth.Forms != null && 
       (auth.Forms.Name != cookieName 
          || FormsAuthentication.FormsCookieName != cookieName
       )
     )
  {
     // Assign value in web.config for future restarts
     auth.Forms.Name = cookieName;
     // would be nice if this restarted the app, but it doesn't appear to
     c.Save();
     // This seems to restart the app
     System.Web.HttpRuntime.UnloadAppDomain();
  }
  ...
}

Файл web.config изменяется при запуске приложения, а затем веб-приложение перезапускается. При следующем запуске веб-приложения имена файлов cookie синхронизируются, а код сброса пропускается.

2 голосов
/ 12 мая 2016

Я боролся с Cookies довольно много дней. Это был потрясающий опыт обучения.

Поэтому хотелось бы поделиться возможными способами, которые я нашел и обнаружил: Существует несколько хаков для изменения имени файла cookie проверки подлинности с помощью форм:

  1. Вы можете автоматизировать изменение имени файла cookie в разделе Authenticaiton раздела Web.Config в событии Application_Start в Global.asax. Спасибо Рону за то, что он поделился этим . Но я не мог гарантировать, что пользователь, чья личность будет использоваться для запуска домена приложения, будет иметь достаточно прав для изменения файла на диске или нет. Поэтому мне нужно было импровизированное решение, поэтому я разработал следующее.

  2. Спасибо ILSpy за предоставленную мне возможность просмотра внутри класса FormsAuthentication и большое спасибо Reflection за то, что он позволил мне изменить приватное поле класса. Я использовал следующий код, чтобы изменить имя куки во время выполнения с помощью следующего небольшого фрагмента кода, и это сработало как шарм !!!


    protected void Application_Start(Object sender, EventArgs e)
    {
        // This will enforce that FormsAuthentication class is loaded from configuration settings for the application.
        FormsAuthentication.Initialize();

        // The new cookie name whatever you need can go here, I needed some value from my application setting to be prefixed so I used it.
        string newCookieName = string.Format("{0}.ASPXAUTH", ConfigurationManager.AppSettings["SomeSettingThatIsUniquetoSite"]);

        // Modifying underlying baking field that points to FormsAuthentication.FormsCookieName         
        Type type = typeof(FormsAuthentication);
        System.Reflection.FieldInfo field = type.GetField("_FormsName", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
        field.SetValue(null, newCookieName);
    }

Предложения, лазейки запрашиваются, так как это мой первый ответ на этом форуме.

2 голосов
/ 06 ноября 2008

В соответствии с MSDN свойство FormsAuthentication.FormsCookieName, в котором хранится имя файла cookie, является свойством только для чтения. Это свойство необходимо прочитать из web.config.

Каждому экземпляру потребуется отдельное имя в файле web.config. Я предлагаю включить имя файла cookie для аутентификации в существующую систему управления изменениями.

...