5

アプリケーションのインスタンスごとに FormsCookiePath の FormsCookieName を変更したいと考えています。1 つのサーバー/ドメイン名に複数のインスタンスを持つアプリケーションがあります。このため、Cookie が相互に上書きされるため、同時に 1 つのアプリケーションでしか作業できません。セッションについても同じです。

たとえば、Global.asax Application_Start でこの名前を動的に変更する方法はありますか? これは、CookieName のベースとして使用できるライセンス名を各アプリケーションに保持するので便利です。

既に Web.config と追加のファイルを使用して、次を使用して外部ファイルの Web.config 値を上書きしています。<appSettings file="Web.AppSettings.Config">

しかし、これには、データベースから設定を取得できるため、忘れられる可能性のある手動のアクションが必要であり、冗長です。

ありがとう。

4

3 に答える 3

3

私はかなりの数日間、Cookieに苦労しています。素晴らしい学習体験になりました。

だから、私が見つけて発見した可能な方法を共有したかった:フォーム認証 Cookie 名を変更するためのいくつかのハックがあります:

  1. Global.asax の Application_Start イベントの Web.Config ファイルの Authenticaiton セクションで、Cookie 名の変更を自動化できます。これを共有してくれたロンに感謝します。しかし、アプリケーション ドメインを実行するために ID を使用するユーザーが、ディスク上のファイルを変更するのに十分な権限を持っているかどうかは保証できませんでした。したがって、即席の解決策が必要だったので、次のように考案しました。

  2. FormsAuthentication クラスの内部を見せてくれた ILSpy に感謝します。また、クラスのプライベート フィールドを変更できるようにしてくれた 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:52:30.627 に答える
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 名が同期され、リセット コードがスキップされます。

于 2011-04-09T17:52:26.233 に答える
2

MSDNによると、Cookie 名を格納する FormsAuthentication.FormsCookieName プロパティは読み取り専用プロパティです。このプロパティは、web.config から読み取る必要があります。

各インスタンスには、web.config で個別の名前が必要です。既存の変更管理システムに認証 Cookie の名前を含めることをお勧めします。

于 2008-11-06T16:48:20.997 に答える