4

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

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" %>
4

5 回答 5

6

基于此:

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

这里的根本问题很简单……你需要充分了解ASP.Net 页面生命周期

快速浏览一下:

在此处输入图像描述

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

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

来自 MSDN:

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

遗憾的是 ASP.Net不是从母版页派生的,为什么?因为母版页被视为控件,所以真正发生的是母版页是Page

备择方案:

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

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

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

    • 应用程序_开始请求。
    • Application_AuthenticateRequest。
    • Application_PostAuthenticateRequest。
    • 应用程序_默认身份验证。
    • 应用程序_授权请求。
    • 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 时触发
    • 应用程序_结束请求。

    欲了解更多信息:

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

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

于 2012-07-17T08:05:25.420 回答
1

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

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

在您的 web.config 中,您可以添加:

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

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

于 2012-07-17T07:25:12.780 回答
1

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

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);
    }
}
于 2012-07-18T05:48:30.890 回答
1

我也遇到过类似的问题。我习惯true了这种Response.Redirect方法,因此其余的负载应该被终止。参考。我检查了母版页中的会话值,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();
        }
    }
}

希望能帮助到你。

于 2015-11-15T03:52:16.720 回答
0

您通过以下方式定义上述代码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);
        }
    }
于 2012-07-17T07:09:32.423 回答