主页检查会话问题

时间:2012-07-17 06:58:33

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

我正在修复朋友的密码。我在母版页中遇到会话值问题。 我在主页中检查会话是空的还是空的,如果它是空的,则转到登录页面。 但是由masterpage创建的其他页面永远不会起作用。

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

5 个答案:

答案 0 :(得分:5)

基于此:

  

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

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

快速浏览一下:

enter image description here

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

  

然后我创建普通的aspx页面,其名称为default.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并且至少>>>>>
    • 时才触发
    • Application_PostMapRequestHandler。
    • Application_AcquireRequestState。
    • Application_PostAcquireRequestState。
    • Application_PreRequestHandlerExecute。
    • 执行页面事件处理程序。 (参见页面生命周期)
    • Application_PostRequestHandlerExecute。
    • 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事件

答案 1 :(得分:1)

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

如果您想在用户未登录时限制对您网站某些区域的访问,那么配置中有一些机制允许:

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

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

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

答案 2 :(得分: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);
    }
}

答案 3 :(得分:1)

我也遇到过类似的问题。我将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();
        }
    }
}

希望它有所帮助。

答案 4 :(得分: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);
        }
    }