我有一个相对简单的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
答案 0 :(得分:2)
不要在会话中存储用户标识符或其他敏感信息,而是使用IIdentity
身份验证实现IPrincipal
和Forms
(尽管这并不完全排除信息暴露)
这样可以轻松访问您所需要的某些元素:
//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