親アプリと子アプリがあります。現在、2 つの個別の Global.asax ファイルがあります。この子アプリに親アプリの Global.asax ファイルを継承させようとしています。
したがって、次のように、App_Code フォルダーにすべてのコードを含むファイルがあります。
namespace NsGlobalAsax
{
public class GlobalAsax : System.Web.HttpApplication
{
public GlobalAsax()
{
//
// TODO: Add constructor logic here
//
}
void Session_Start(object sender, EventArgs e)
{
// add some data to the Session so permanent SessionId is assigned
// otherwise new SessionId is assigned to the user until some data
// is actually written to Session
Session["Start"] = DateTime.Now;
// get current context
HttpContext currentContext = HttpContext.Current;
if (currentContext != null)
{
if (!OnlineVisitorsUtility.Visitors.ContainsKey(currentContext.Session.SessionID))
OnlineVisitorsUtility.Visitors.Add(currentContext.Session.SessionID, new WebsiteVisitor(currentContext));
}
}
void Session_End(object sender, EventArgs e)
{
// Code that runs when a session ends.
// Note: The Session_End event is raised only when the sessionstate mode
// is set to InProc in the Web.config file. If session mode is set to StateServer
// or SQLServer, the event is not raised.
if (this.Session != null)
OnlineVisitorsUtility.Visitors.Remove(this.Session.SessionID);
}
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;
}
}
}
これで、親の Global.asax ファイルが次のようになります。
<%@ Application Language="C#" CodeBehind="Global.asax.cs" src="Global.asax.cs" Inherits="RootAsax.BaseGlobal" %>
コードビハインド ファイルは次のとおりです。
namespace RootAsax
{
public class BaseGlobal : NsGlobalAsax.GlobalAsax
{}
}
ここに私の子アプリの Global.asax ファイルがあります:
<%@ Application Codebehind="Global.asax.cs" Inherits="FormsAuthAd.Global" Language="C#" %>
コードビハインド ファイルは次のとおりです。
namespace FormsAuthAd
{
public class Global : NsGlobalAsax.GlobalAsax
{
}
}
コード ビハインド ファイル内の両方のクラスは、App_Code フォルダー内のソースから継承されていますが、認証ステータスはアプリ間で渡されていません。たとえば、親アプリにログインすると、認証は子アプリに引き継がれません。その逆もまた真です。
皆さんに十分な詳細をお伝えできたことを願っています。
ありがとう!
編集:
Heinzi はコメントで、これは継承の問題ではないと述べています。子アプリで親の Global.asax ファイルを使用する方法を理解する必要があります。子アプリの Global.asax ファイル認証を削除すると、子アプリではまったく機能しません。何か案は?