2011-03-22 47 views
0

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

在我的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中的编辑链接也会将LoginPanel显示返回到Default.aspx页面。

我根本不是ASP.net的专家,而且我很聪明。所以请尽可能少用行话等方式来回答问题,然后发布文档和msdn等链接,以便我不只是解决这个问题,而是真正理解为什么这会给我做恶梦。

TIA

+3

是一个Web农场在生产服务器? – Chandu 2011-03-22 13:32:17

+0

您是否将数据库移至服务器?它是否具有与本地副本相同的信息? – 2011-03-22 13:38:20

+0

不确定服务器是否在服务器场中。数据库没有问题向上移动。 – n4rzul 2011-03-23 11:09:44

回答

2

不存储用户标识符或通话的其它敏感信息,实现IIdentityIPrincipalForms验证,而不是(虽然这并不能完全彻底排除信息曝光)。

这使得方便地访问某些元素在你需要什么性质:

//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 命名空间,你可以使用 授权,并在您applicati认证用户 上。


一种的IIdentity封装了一个 认证用户。 IPrincipal是 用户的身份和他或她拥有的任何角色的组合。您可以使用中的预定义标识和 System.Security.Principal命名空间或 中的主体类,您可以通过创建实现 接口的类创建类别 来添加自定义身份验证。


护理应给予 权限与IIdentity的工作 对象时使用,因为这些对象可以使敏感 用户相关信息 。您应该保护 应用程序的当前IPrincipal 对象免受更改,因为 应用程序的授权功能 基于其当前主体。

你可以得到这样做的信息from MSDN

2

可能有点偏离主题,但我会建议使用内置登录功能,这意味着登录控件,成员资格和身份验证。然后,你不必惹会话

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

那么你可以例如拿到钥匙

+0

嗯,也许我应该从一开始就这样做。我以前从未使用过。你能给我一些指导我如何使用它?不使用Windows身份验证,只需使用db中的表称为用户,角色和桥接表br_userroles – n4rzul 2011-03-22 14:42:10

+0

您不必使用Windows身份验证,则应使用表单身份验证。当然你可以拥有自己的表格,你需要实现自定义的Membership Provider并将其设置在web.config中,这里是如何:http://msdn.microsoft.com/en-us/library/6tc47t75.aspx, http://msdn.microsoft.com/en-us/library/44w5aswa.aspx同样适用于RoleProvider。与DB的通信发生在这些提供者内部,您只需重写方法 – Robert 2011-03-22 15:16:24

+0

@Robert:'Forms Authentication'!='ASP.NET Membership'。 – 2011-03-22 15:52:31

0

验证做Membership.GetUser()。ProviderUserKey如果在生产服务器上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

+0

是的,那条线是存在的 – n4rzul 2011-03-23 11:08:57