Como mudar FormsCookieName em tempo de execução em ASP.NET
-
06-07-2019 - |
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.
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:
-
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.
-
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.