0

現在、いくつかのレガシー コードに取り組んでおり、Global.asax ファイルを親アプリケーションに移動しようとしています。これにより、すべての子アプリケーションが管理されます。現在、すべての子アプリに Global.asax ファイルがあります (悪い)。

子アプリケーションから Global.asax ファイルを削除しようとすると、残念ながら親アプリケーションの Global.asax ファイルが見つかりません。したがって、子アプリ内で認証されたままにすることはできません。これに対する簡単な修正があるかどうか疑問に思っていました。

構造:

parent app 
  files...
  childapp
    files..
    global.asax
  global.asax

childapp が親の Global.asax ファイルを見つけられるようにします。

みんなありがとう!

編集:

Global.asax

(これは親アプリと子アプリで同じです)

protected void Application_Start(object sender, EventArgs e)
        {

        }

        protected void Session_Start(object sender, EventArgs e)
        {

        }

        protected void Application_BeginRequest(object sender, EventArgs e)
        {

        }

        public void Application_AuthenticateRequest(Object sender, EventArgs e)
        {
            String cookieName = FormsAuthentication.FormsCookieName;
            HttpCookie authCookie = Context.Request.Cookies[cookieName];

            if (null == authCookie)
            {//There is no authentication cookie.
                return;
            }

            FormsAuthenticationTicket authTicket = null;

            try
            {
                authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            }
            catch (Exception ex)
            {
                //Write the exception to the Event Log.
                return;
            }

            if (null == authTicket)
            {//Cookie failed to decrypt.
                return;
            }

            //When the ticket was created, the UserData property was assigned a
            //pipe-delimited string of group names.
            String[] groups = authTicket.UserData.Split(new char[] { '|' });

            //Create an Identity.
            GenericIdentity id = new GenericIdentity(authTicket.Name, "LdapAuthentication");

            //This principal flows throughout the request.
            GenericPrincipal principal = new GenericPrincipal(id, groups);

            Context.User = principal;

        }

        protected void Application_Error(object sender, EventArgs e)
        {

        }

        protected void Session_End(object sender, EventArgs e)
        {

        }

        protected void Application_End(object sender, EventArgs e)
        {

        }
4

1 に答える 1

0

他の人があなたの目標を達成するためのより良い方法があると述べているように、厳密に言えば、私があなたの質問を正しく理解すれば、それは可能であるはずです。

各Global.asaxが継承するクラスは、共有アセンブリに含まれている必要があります。次に、各Global.asaxファイルのマークアップを変更して、その共有クラスから継承できます。

<%@ Application Inherits="MySharedGlobal" Language="C#" %>

各アプリケーション(親と子の両方)のコードビハインドを削除できますが、Glabal.asaxファイルは残しておく必要があります。

各アプリケーションオブジェクトがコードビハインドで継承するのと同じくらい簡単に、共有コードを基本クラスに移動できます。これにより、必要に応じてアプリケーション固有のロジックを追加できます。

これで、共有コードを配置するIHttpModuleを作成することもできます。親アプリケーションに読み込まれると、子アプリケーションにも読み込まれます(構成の継承を介して)。

編集:
あなたが正しく理解している場合は、コピーして何度も貼り付けることなく、各アプリケーションで同じコードを実行する必要があります。ネストされたサイトごとに実際の「アプリケーション」が必要な場合は、そのコードを複数回実行する必要があります。ただし、共有できないという意味ではありません。

これを行う簡単な方法は、それを実装するクラスを作成しIHttpModule、それを親アプリケーションの構成ファイルに追加することです。'Init'メソッドでは、AuthenticateRequestイベントにフックして、そこから投稿したのと同じコードを代わりに実行し、各子アプリケーションの背後にあるGlobal.asaxコードから削除できます。

これを実現する別の方法は、同じイベントへのフックの実装を作成することですHttpApplication(現在と同じように)。次に、共有コードを基本クラスに配置すると、Global.asaxコードビハインドファイルの各クラスがそれを継承します。次に、各Global.asaxコードビハインドファイルからコードを削除できます。

IHttpModuleGlobal.asaxファイルを作成すると、削除される可能性があります。そうでなければ、彼らはとどまる必要があるでしょう。

于 2013-01-25T16:54:04.823 に答える