【问题标题】:Masterpage check session issue母版页检查会话问题
【发布时间】:2015-11-15 12:29:07
【问题描述】:

我正在修复我朋友的代码。我对母版页中的会话值有疑问。 我正在检查主页面中的会话是否为空或为空,如果为空,请转到登录页面。 但是母版页创建的其他页面永远无法正常工作。

if (Session["user"] != null && Session["user"] != "")
{ }
else
{
    Response.Redirect("/Account/Login.aspx?link=" + System.Web.HttpContext.Current.Request.Url.PathAndQuery);
}

我尝试使用 Session["user"].ToString() 但结果相同。

并且其他页面通过此会话具有其他控件,因此如果您未登录,它总是会出错。

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    MaintainScrollPositionOnPostback="true" CodeFile="document.aspx.cs" Inherits="document" %>

【问题讨论】:

  • 您能否指定在哪个 page 事件中创建/使用会话的控件。此外,您在哪个 masterpage 事件中检查会话
  • 例如,我正在创建名为 back.master 的母版页,并且在 page_load 事件中我编写了会话控制事件。然后我创建了一个名为 default.aspx 的普通 aspx 页面,由 back.master 派生,我还在 page_load 事件中编写了一些检查代码。例如。 label.text = session["user"].tostring();但是 back.master 的 page_load 中的会话控制在 default.aspx page_load 之后触发,所以它给了我“会话为空”的错误。但是如果我创建新的网络项目没关系,那没问题。

标签: c# asp.net session .net-4.0


【解决方案1】:

基于此:

但是 back.master 的 page_load 中的会话控制在 default.aspx page_load 之后触发,所以它给了我错误“会话为空”

这里的根本问题很简单……你需要完全理解ASP.Net page life-cycle

快速浏览:

基本上你的以下假设是错误的:

然后我创建一个名为 default.aspx 的普通 aspx 页面,并且 由 back.master 派生

来自 MSDN:

母版页的行为类似于页面上的子控件:母版页 Init 事件发生在页面 Init 和 Load 事件之前,而母版页 Load 事件发生在页面 Init 和 Load 事件之后

遗憾的是 ASP.Net 并非源自母版页 为什么?因为母版页被视为控件所以真正发生的是母版页是Page的子控件

替代方案:

  • 由于您正在检查用户是否经过身份验证,因此最好依赖 ASP.Net 身份验证和授权 API

解决方法(如果您坚持使用自己的身份验证机制):

  • (最佳建议)创建一个自定义 HttpModule 并在其中检查 Session 对象。我认为最适合您需求的事件是:Application_AuthenticateRequest。这是您可以选择的完整事件列表:(顺便说一句,无需创建新的 HttpModule,您可以使用 Web 应用程序的 Global.asax 文件订阅事件,仅使用 HttpModule如果您想封装逻辑以重用它)

    • Application_BeginRequest。
    • Application_AuthenticateRequest.
    • Application_PostAuthenticateRequest.
    • Application_DefaultAuthentication。
    • Application_AuthorizeRequest.
    • Application_PostAuthorizeRequest.
    • Application_ResolveRequestCache。
    • Application_PostResolveRequestCache。
    • Application_MapRequestHandler。仅当服务器在集成模式下运行 IIS 7 且至少 >Net Framework 3.0
    • 时触发
    • Application_PostMapRequestHandler。
    • Application_AcquireRequestState。
    • Application_PostAcquireRequestState。
    • Application_PreRequestHandler 执行。
    • 页面事件处理程序被执行。 (参考页面生命周期)
    • Application_PostRequestHandler 执行。
    • Application_ReleaseRequestState。
    • Application_PostReleaseRequestState
    • Application_UpdateRequestCache。
    • Application_PostUpdateRequestCache
    • Application_LogRequest。仅当服务器为 IIS 7 集成模式且至少为 .Net Framework 3.0 时触发
    • Application_PostLogRequest。仅当服务器为 IIS 7 集成模式且至少为 .Net Framework 3.0 时触发
    • Application_EndRequest。

    更多信息:

  • 创建一个继承自Page 的通用页面并将检查代码放置在PreLoadLoad 事件中,这两个事件都可以工作并最终从该页面继承您的所有页面

  • (不推荐)如果你想在母版页中封装检查,你可以使用Init事件

【讨论】:

  • 嗯,我不同意来自 MSDN:ASP.NET 母版页允许您为应用程序中的页面创建一致的布局。单个母版页定义了您希望应用程序中所有页面(或一组页面)的外观和标准行为。开发人员过去考虑母版页的方式与您相同,但事实并非如此,因为它们只是定义页面布局的控件...是的,您可以尝试 在那里封装你的自定义逻辑,但这不是一个完美的地方,如果你尝试你会发现这样的问题。
  • 封装页面常见行为的最佳位置是HttpModule,或从页面继承。
  • 但是让我们这样说。在 default.aspx 中没有代码。只是 Masterpage 有会话控制。如果我想使用 default.aspx 没关系。它进入 login.aspx,一切都很好。但是当我创建另一个页面时,它永远不会进入登录页面。我还创建了一个 Web 用户控件来控制会话并将其放在母版页中。所以每个页面都有用户控制权。还是不行。
  • 在这种情况下,请尝试以下操作: 1. 在每个页面中进行调试,以确保正在触发用户控制代码(检查 Session["user"] 的代码) 2. 如果代码是被解雇然后会话出现问题,当您访问新页面时没有正确设置Session 或者它已被删除(可能会话过期)。检查 web.config 文件中的 Session 配置(在此处发布)并确保 Session 的设置方式与您访问原始 default.aspx
  • 如果我第一次登录,它就会启动。但是,如果我没有登录,它不会触发,因为它会在其他页面中给我带来会话错误。
【解决方案2】:

IIS 具有用于身份验证和授权的标准方法。

如果您想在用户未登录的情况下限制对网站某些区域的访问,那么配置中的机制允许这样做:

您可以在 web.config 中添加:

<location path="LoginRequiredDir">
  <system.web>
     <authorization>
        <deny users="?"/>
     </authorization>
  </system.web>
</location>

如果用户未登录,这将自动将用户带到登录页面。

【讨论】:

    【解决方案3】:

    修复:它将解决您的问题。

    protected void Page_Init(object sender, EventArgs e)
    {
        if (Session["master"] != null)
        { }
        else
        {
            Response.Redirect("login.aspx?link=" + System.Web.HttpContext.Current.Request.Url.PathAndQuery);
        }
    }
    

    【讨论】:

      【解决方案4】:

      我也遇到过类似的问题。我将true 用于Response.Redirect 方法,以便终止其余的负载。 Ref。我在母版页的Page_Init 中检查了会话值,如下所示。

      public partial class Dashboard : System.Web.UI.MasterPage
      {
          protected void Page_Init(object sender, EventArgs e)
          {
              if (Session["RoleId"] == null || Session["RoleId"].ToString() == "")
              {
                  Response.Redirect("/account", true);
              }
          }
          protected void Page_Load(object sender, EventArgs e)
          {
      
              if (!IsPostBack)
              {
                      setUserInfo();
              }
          }
      }
      

      希望对您有所帮助。

      【讨论】:

        【解决方案5】:

        你定义上面的代码Page_Load方法如下:

         protected void Page_Load(object sender, EventArgs e)
            {
                if (Session["user"] != null && Session["user"].ToString() != "")
                {
                    //do code here
                }
                else
                {
                    Response.Redirect("/Account/Login.aspx?link=" + System.Web.HttpContext.Current.Request.Url.PathAndQuery);
                }
            }
        

        【讨论】:

        • 您是否设置了给定 id 即用户的会话?
        猜你喜欢
        • 1970-01-01
        • 2021-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-09
        • 1970-01-01
        相关资源
        最近更新 更多