2

我想动态设置 FormsAuthentication cookie 名称,例如 guid。我怎样才能做到这一点。我已经可以在 web.config 中将其更改为我想要的任何内容。我只是不能在代码中动态地做到这一点。请帮忙。

<authentication mode="Forms">
  <forms name="myName" loginUrl="~/Account/Login" defaultUrl="~/Admin/admin" cookieless="UseCookies" slidingExpiration="true"  timeout="40320"/>
</authentication>

我想这样做的原因是,我的应用程序的多个实例在同一主机上,我不希望它们覆盖彼此的 cookie。

4

2 回答 2

4

几天来,我一直在与 Cookies 作斗争。这是一次很棒的学习经历。

所以想分享一下我发现和发现的可能方式:有几个HACKs可以修改Forms Authentication Cookie name:

  1. 您可以在 Global.asax 的 Application_Start 事件中的 Web.Config 文件的 Authenticaiton 部分下自动修改 cookie 名称。感谢罗恩分享这个。但我不能保证其身份将用于运行应用程序域的用户是否有足够的权限来修改磁盘上的文件。因此我需要一个即兴的解决方案,所以我设计了以下方法。

  2. 感谢 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);
    }

请求建议,漏洞,因为这是我在这个论坛上的第一个答案。

于 2016-05-12T09:07:28.190 回答
1

您不能在代码中执行此操作;FormsAuthentication.FormsCookieName属性是只读的。我将在以下配置中使用web.config

<authentication mode="Forms">
  <forms configSource="forms.config" />
</authentication>

然后给应用程序的每个实例自己的forms.config

<forms name="CookieNameForThisInstance" />
于 2013-09-08T12:04:00.940 回答