Pergunta

Gostaríamos de ter o FormsCookieName da mudança FormsCookiePath por instância da nossa aplicação. Temos uma aplicação que tem várias instâncias em 1 servidor / domainname. Devido a isso, só podemos trabalhar em um aplicativo ao mesmo tempo, já que os biscoitos irá substituir o outro. Mesmo para o Sessões btw.

Existe uma maneira de dynamicly, por exemplo, no Global.asax Application_Start, alterar este nome? Isso seria útil como mantemos um nome de licença em cada aplicação que poderia ser usado como base para o CookieName.

Já trabalho com Web.config e arquivos extras para substituir valores Web.config em arquivos externos usando: <appSettings file="Web.AppSettings.Config">

Mas isso requer ações manuais que podem ser esquecidas e são redundantes já que as configurações podem ser recuperadas a partir do banco de dados.

Graças.

Foi útil?

Solução

De acordo com a MSDN , a propriedade FormsAuthentication.FormsCookieName que armazena o nome do cookie é uma propriedade só de leitura. Essa propriedade deve ser lido a partir do web.config.

Cada instância terá um nome diferente no web.config. Sugiro incluindo o nome do cookie de autenticação em seu sistema de gerenciamento de mudança existente.

Outras dicas

Tive situação semelhante, eu fiz o seguinte. No Application_Start, eu verifiquei para ver se meu nome de cookie necessária mudança. Isso ocorreria depois de uma nova implantação para todas as aplicações onde eu tenho o mesmo web.config para todos.


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();
  }
  ...
}

O web.config é modificado no início do aplicativo e, em seguida, o aplicativo web é reiniciado. Da próxima vez que o aplicativo web vem à tona, nomes biscoito estão em sincronia e o código de reset é ignorado.

Eu têm lutado com cookies com muito poucos dias. Tem sido uma experiência incrível de aprendizagem.

Então queria compartilhar as possíveis maneiras que encontrei e descobertas: Existem vários hacks para modificar as Formas nome de autenticação Cookie:

  1. Você pode automatizar a modificação do nome do cookie sob authenticaiton secion de arquivo Web.Config no evento Application_Start no Global.asax. Graças à Ron para a partilha este . Mas eu não podia garantir que o usuário cuja identidade seria usado para executar domínio de aplicação tem privilégios suficientes para modificar o arquivo no disco ou não. Daí eu precisava de uma solução improvisada, então eu criei seguinte.

  2. Graças à ILSpy por me deixar ver dentro da classe FormsAuthentication, e muitas graças a reflexão para me deixar modificar o campo privado de uma classe. Eu usei código a seguir para modificar o nome do cookie no tempo de execução com o seguinte pequeno pedaço de código e isso funcionou como um encanto !!!


    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);
    }

Sugestões, brechas são solicitados como esta é a minha primeira resposta neste fórum.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top