如何在30分钟之后检查用户是否经过身份验证且会话在页面上有效。
答案 0 :(得分:2)
假设您要么挂钩standard ASP.NET membership providers或使用IIS中的基本/摘要式身份验证,那么您可以轻松判断用户是否使用以下身份进行身份验证:
if (Request.IsAuthenticated)
{
// User is authenticated, allow them to do things
}
如果他们的身份验证令牌已过期(使用Forms Auth默认为20分钟,Windows身份验证应该对每个请求重新进行身份验证),那么下次检查时,IsAuthenticated将返回false。
您可以在用户会话中存储一个映射回其用户帐户的令牌(用户名的哈希,或者用户ID或类似用户),然后在请求中检查两个 - 如果不是匹配,然后会话变得无效:
// Get the current user, and store their ID in session
MembershipUser user = Membership.GetUser();
Session["UserId"] = user.ProviderUserKey;
要检查一下:
if (null != Session["UserId"]) {
MembershipUser user = Membership.GetUser();
if (Session["UserId"] == user.ProviderUserKey) {
// User and session are valid
}
}
但说实话,这取决于你想要做什么。
如果您想在用户未登录时限制对您网站某些区域的访问,那么配置中有一些机制允许:
在您的web.config中,您可以添加以下行:
<location path="SecureDirectory">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
这将拒绝所有匿名用户访问目录/SecureDirectory/
及其下的所有内容,并将其定向到您配置的登录页面 - 有关Authorization元素的更多信息,请参阅“How to: Configure Directories Using Location Settings”
答案 1 :(得分:0)
您必须在一段时间后使会话过期。
因此,web.config
中有一个部分,或者您必须在<system.web />
将此部分放入:
<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424"
stateNetworkTimeout="10" cookieless="false" timeout="30" />
如果您发现我们使用InProc
模式并且超时为30
现在一切都取决于你。
在任意key
页面中找到时,在Session
对象中添加WebForm
。
public void btnLogin(object sender, EventArgs e) {
if (validUser) {
Session["authenticated"] = true;
}
}
并在需要时检查Session["authenticated"]
。
Session
对象将在会话实例化的30分钟内过期。
希望这有帮助。如果您遇到麻烦,请随时给我留言。
答案 2 :(得分:0)
在会话开始时,您可以通过Global.asax
在会话状态中存储一些键值:
void Session_Start(object sender, EventArgs e)
{
Session["userId"] = userId; // obtained from a data source or some other unique value, etc.
}
每当用户发出页面请求或回发时,在页面加载任何或所有页面时,检查会话值是否为空:
protected void Page_Load(object sender, EventArgs e)
{
if(Session["userId"] == null)
{
Response.Redirect("logout.aspx");
}
// do other stuff
}
如果是,则会话已过期,您可以重定向到注销页面或其他任何内容。超时间隔在web.config
文件中定义。