0

我现在正在处理一些遗留代码,我正在尝试将 Global.asax 文件移动到父应用程序,它将管理所有子应用程序。目前我们在所有子应用程序中都有一个 Global.asax 文件(坏)。

当我尝试从子应用程序中删除 Global.asax 文件时,不幸的是它找不到父应用程序的 Global.asax 文件。因此,我无法在子应用程序中保持身份验证。我想知道是否有一个简单的解决方法。

结构:

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

我希望 childapp 找到父母的 Global.asax 文件。

多谢你们!

编辑:

全球.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 回答