我在ASP.NET上使用表单身份验证。如果我尝试通过复制查询字符串并将其粘贴到浏览器来访问页面,则允许我访问该页面。
如何防止这种情况?我希望用户始终必须登录。
答案 0 :(得分:5)
您必须在web.config中设置身份验证模式
<authentication mode="Forms">
<forms name="Authen" protection="All" timeout="60" loginUrl="login.aspx"/>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
答案 1 :(得分:1)
您可以使用<location>
元素限制对某些页面的访问。例如,限制对子文件夹admin
的访问:
<system.web>
<!-- enable Forms authentication -->
<authentication mode="Forms">
<forms
name="MyAuth"
loginUrl="login.aspx"
protection="All"
path="/"
/>
</authentication>
</system.web>
<!-- restrict access to the admin subfolder
and allow only authenticated users -->
<location path="admin">
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</location>
答案 2 :(得分:0)
您应该在web.config文件中添加类似内容:
<authorization>
<allow users="user1, user2"/>
<deny users=”?”/>
</authorization>
那应该解决问题。请参阅:http://support.microsoft.com/kb/815151
答案 3 :(得分:0)
除了在 web.config 文件中配置身份验证之外,您还可以使用Global.asax Session_Start(...)方法检查用户是否有新会话,还要确保修改会话cookie,如果它为null,则应将用户重定向到登录页面:
public class Global:System.Web.HttpApplication
{
protected void Session_Start(object sender, EventArgs e)
{
if(Session.IsNewSession)
{
if (Request.Headers["Cookie"] != null)
{
if (Request.Headers["Cookie"].IndexOf("Web_App_Login_Cookie", StringComparison.OrdinalIgnoreCase) >= 0)
{
FormsAuthentication.SignOut();
Context.User = null;
Response.Redirect("~/logOn.aspx");
}
}
}
}
}
此外,如果您将用户会话信息存储在某个类中,则可以覆盖某些基类中的 OnInit(...)方法,以确保用户已存在于某些自定义会话集合中,如果不存在您应该再次重定向到登录页面。
public class SessionBasePage : System.Web.UI.Page
{
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
if (HttpContext.Current != null && HttpContext.Current.Session != null)
{
UserSession = HttpContext.Current.GetUserSession();
if (UserSession != null)
{
LoggedUserInfo = HttpContext.Current.GetLoggedUserInfo();
HttpContext.Current.UpdateLoggedUserInfo();
}
else { Response.Redirect("~/logOn.aspx", true); }
}
}
}