丢失ASP会话变量,或者我认为

时间:2011-03-22 13:29:46

标签: c# asp.net session

我有一个相对简单的ASP.Net应用程序,我已经构建了一些简单的安全性。用户使用用户名和密码登录,然后根据数据库进行检查。如果成功,我将一个User对象存储在名为“UserID”的会话变量上,并将它们重定向到同一页面,只是这次他们没有看到登录面板。 (嗯,我可以动态地隐藏它,但我认为这会导致页面重新加载)

在我的Default.aspx页面上,我有以下代码:

protected void Page_Load(object sender, EventArgs e)
{
    if (Session["UserID"] == null)
    {
        LoginPanel.Visible = true;
    }
}

protected void btnLogin_Click(object sender, EventArgs e)
{
    Security security = new Security();
    Session["UserID"] = security.LoginUser(txtUsername.Text, txt2Password.Value);
    if (Session["UserID"] != null)
    {                
        Response.Redirect("~/default.aspx");
    }
}

是的,到目前为止一切顺利。此时还值得一提的是母版页:

protected void Page_Load(object sender, EventArgs e)
{
    if (Session["UserID"] == null)
    {
        //Check that we are not already on the default.aspx page.
        //Don't want to cause infinite redirect here
        if (!Request.Path.ToLower().Contains("default.aspx"))
        {
            Page.Response.Redirect("~/Default.aspx");
        }
    }
    else
    {
        //Otherwise we get the UserObject from the session and display menu items           //based on the role. Nothing fancy.

    }


}

//Bad naming. This a logout link on the master...
protected void Unnamed1_Click(object sender, EventArgs e)
{    
    Session["UserID"] = null;
    Page.Response.Redirect("~/Default.aspx");
}

现在所有这一切都完全适用于我的本地IIS实例。一旦我将它部署到我们的生产服务器上,然后点击我的一个菜单项并导航到Search.aspx,它会让我回到我的Default.aspx页面,其中LoginPanel可见???这也是在Firefox中。使用IE浏览器我可以单击Search.aspx菜单链接,它会将我带到页面,但点击GridView中的编辑链接也会让我回到Default.aspx页面并显示LoginPanel。

我根本不是ASP.net的专家,而且我的智慧结束了。所以请用尽可能少的行话来解答答案等等,并发布msdn for docs等链接,以便我不仅解决这个问题,而且实际上理解为什么这会给我做噩梦。

TIA

3 个答案:

答案 0 :(得分:2)

不要在会话中存储用户标识符或其他敏感信息,而是使用IIdentity身份验证实现IPrincipalForms(尽管这并不完全排除信息暴露)

这样可以轻松访问您所需要的某些元素:

//to sign-in:
FormsAuthentication.SignIn("username", createPersistentLogin);

//to sign-out:
FormsAuthentication.SignOut();

//user data access:
Page.User.IsInRole("requiredRole");

Page.User.Identity.IsAuthenticated;

Page.User.Name;

来自MSDN的几个片段解释了这个的含义:

  

.NET Framework提供了一个   基于角色的安全实施   System.Security.Principal   命名空间,您可以使用它   授权和验证用户   在你的申请中。


  

一个IIdentity封装了一个   认证用户。 IPrincipal是一个   结合的身份   用户和他或她拥有的任何角色。您   可以使用预定义的身份和   主要课程   System.Security.Principal命名空间或   您可以添加自定义身份验证   创建实现的类   接口


  

授予时应小心谨慎   与IIdentity合作的权限   对象,因为这些对象   敏感的用户相关信息   可用。你应该保护   应用程序的当前IPrincipal   来自变化的对象,因为   应用程序的授权功能   是基于其目前的原则。

您可以获取有关执行此操作的信息from MSDN

答案 1 :(得分:2)

可能有点偏离主题,但我建议使用内置登录功能,这意味着登录控件,成员身份和身份验证。那你就不必搞乱Session

http://msdn.microsoft.com/en-us/library/yh26yfzy.aspx

然后你可以做Membership.GetUser()。ProviderOserKey例如获取密钥

答案 2 :(得分:0)

验证您的网站的Web.Config文件是否在您的生产服务器中包含此行或类似内容:

<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20" />

它必须在元素内部。

验证你正在使用的sessionState。

查看链接: Asp.NET Session State