我们希望FormsCookiePath的FormsCookieName更改我们的应用程序的每个实例。我们有一个应用程序,它在1个服务器/域名上有多个实例。因此,我们只能同时在1个应用程序中工作,因为cookie会相互覆盖。对于Sessions顺便说一下。
有没有办法动态地,例如在Global.asax Application_Start中,更改此名称?这将是有用的,因为我们在每个应用程序中保留许可证名称,可以用作CookieName的基础。
我们已经使用Web.config和额外文件来覆盖外部文件中的Web.config值,使用:<appSettings file="Web.AppSettings.Config">
但这需要手动操作,这些操作可能会被遗忘并且是多余的,因为可以从数据库中检索设置。
感谢。
答案 0 :(得分:3)
我有类似的情况,我做了以下。在Application_Start中,我检查了我的cookie名称是否需要更改。对于我拥有相同web.config的所有应用程序的新部署之后,会发生这种情况。
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,然后重新启动Web应用程序。下次启动Web应用程序时,cookie名称将同步,并且会跳过重置代码。
答案 1 :(得分:2)
根据MSDN,存储cookie名称的FormsAuthentication.FormsCookieName属性是只读属性。必须从web.config中读取此属性。
每个实例在web.config中都需要一个单独的名称。我建议在现有的变更管理系统中包含身份验证cookie的名称。
答案 2 :(得分:2)
我在很长一段时间里一直在努力使用Cookie。这是一次非常棒的学习经历。
所以想分享我找到的可能方式&amp;发现:有几个HACK修改表单身份验证Cookie名称:
您可以在Global.asax的Application_Start事件中的Web.Config文件的Authenticaiton secion下自动修改cookie名称。感谢Ron分享this。但我无法保证其身份将用于运行应用程序域的用户具有足够的权限来修改磁盘上的文件。因此我需要一个即兴的解决方案,所以我设计了以下内容。
感谢ILSpy允许我在FormsAuthentication类中查看,并且非常感谢Reflection允许我修改类的私有字段。我使用以下代码在运行时使用以下一小段代码修改cookie名称,这就像一个魅力!
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);
}
建议,请求漏洞,因为这是我在这个论坛上的第一个答案。