我有一个快速的问题。在我的代码中,我有这个:
if(!(username.IsEmpty() || password.IsEmpty()))
{
if (WebSecurity.UserExists(username) && WebSecurity.GetPasswordFailuresSinceLastSuccess(username) > 4 && WebSecurity.GetLastPasswordFailureDate(username).AddSeconds(120) > DateTime.UtcNow)
{
Session["gActionMessage"] = "You're account has been locked due to too many failed login attempts. " +
"Please try again in 2 minutes.";
Session["gActionMessageDisplayed"] = "not";
Response.Redirect("~/");
return;
}
if(WebSecurity.Login(username, password, false))
{
errorMessage = "";
}
}
if (!WebSecurity.IsAuthenticated)
{
errorMessage = "You are no longer logged in. Please supply your username and password credentials along with the rest of the form data.";
}
当我尝试使用此代码时(登录后的检查实际上是在 if(IsPost) 内,这样我就可以在使用发布的数据之前检查用户是否仍然登录。当它失败时检查“if(! WebSecurity.IsAuthenticated)”第一次打开页面的一小部分,询问登录信息。一旦重新进入并重新发布,检查会读取“用户名”和“密码”的值并尝试重新登录他们进来。它就是这样做的,但是在他们应该“登录”之后直接通过“if(!WebSecurity.IsAuthenticated)”分支并执行其内容。我是否正在检查“if(!WebSecurity.IsAuthenticated) ” 很快?页面是否必须在一个人真正被认为经过身份验证之前完成加载?
我似乎无法确定为什么会发生这种情况,也无法在研究中找到任何帮助。
谢谢大家,任何帮助!
更新:
我已经发布了出现在上面代码下方的代码,如下:
if((Roles.IsUserInRole((WebSecurity.CurrentUserName), "Locked")) || (Roles.IsUserInRole((WebSecurity.CurrentUserName), "AdminLocked")))
{
Session["gActionMessage"] = "Your account is locked. ";
Session["gActionMessage"] += "Please contact an administrator and ask that your account be approved.";
Session["gActionMessageDisplayed"] = "not";
Response.Redirect("~/");
}
}
}
@RenderPage("~/Shared/HeaderLayout.cshtml")
<div>
<span><button type="button" class="btn" onclick="location.href='/IntroPage.cshtml'">Main Page</button></span><span class="heading">Lookup Entry</span><span><button type="button" class="btn" onclick="javascript:document.getElementById('searchForm').submit()">Search</button></span></br></br>
<span style="font-size: 3em; color: #808080;">________________________________________________</span></br></br></br>
</div>
<div id="FormHolder">
<form id="searchForm" class="searchForm" method="post" action="">
@{
if (errorMessage != "")
{
<div class="errorMessageWrapper"><span style="font-style: italic; font-weight: 700;">ERROR:</span><br/>@errorMessage<br/><br/>
@if(!WebSecurity.IsAuthenticated && success==false)
{
<table class="accInterfaceTable">
<tr>
<td class="accInterfaceLabelCell">
<label for="username">Email:</label>
</td>
<td class="accInterfaceInputCell">
<input type="text" id="username" name="username" /><br/><br/>
</td>
</tr>
<tr>
<td class="accInterfaceLabelCell">
<label for="password">Password:</label>
</td>
<td>
<input type="password" id="password" name="password" /><br/><br/>
</td>
</tr>
</table><br/><br/>
<input type="hidden" id="hiddenLoginSubmit" name="hiddenLoginSubmit" value="" />
<input type="submit" class="btn" value="Log In" />
}
</div><br/>
}
}
<table class="searchTable">
<tr>
<th>Search Field<br/><br/></th>
<th></th>
<th>Search Condition<br/><br/></th>
<th></th>
<th>Search Parameter<br/><br/></th>
</tr>
这下面还有更多的html,但它只是一个多余的html表单。
更新2:
好吧,我从来没有找到为什么在明确的“if(WebSecurity.Login(username, password, false))”分支执行后直接执行“if(!WebSecurity.IsAuthenticated)”分支的原因,但是我能够将一个单独的本地布尔变量与逻辑联系起来,现在一切正常(我检查以确保它始终检查,除非只是使用上面的分支登录,并检查以确保它确实登录等) .
如果有人能告诉我为什么会发生这种情况,以利于我(以及其他任何遇到此页面并遇到类似问题的人)的教育,我将很乐意接受答案。
谢谢您的帮助!