2

我有一个快速的问题。在我的代码中,我有这个:

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)”分支的原因,但是我能够将一个单独的本地布尔变量与逻辑联系起来,现在一切正常(我检查以确保它始终检查,除非只是使用上面的分支登录,并检查以确保它确实登录等) .

如果有人能告诉我为什么会发生这种情况,以利于我(以及其他任何遇到此页面并遇到类似问题的人)的教育,我将很乐意接受答案。

谢谢您的帮助!

4

2 回答 2

4

我记得在 MSDN 或某个地方阅读过,WebSecurity.IsAuthenticated 在页面完全加载之前不起作用。这意味着如果您在页面中登录用户并且在您检查 IsAuthenticated 的同一代码流中,它将不会返回 True。要使 IsAuthenticated 为 True,必须重新加载页面或使用更好的做法;这是在登录成功后立即将用户重定向到另一个安全页面,并在该页面中检查 IsAuthenticated。

希望能帮助到你。

于 2013-02-05T11:49:50.353 回答
0

检查您的 webconfig,您必须启用表单身份验证:

在里面添加以下代码段

   <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="3600" />
    </authentication>

如果它在您的 webconfig 中,请注释掉:

<!--<modules>
      <remove name="FormsAuthentication" />
</modules>-->

现在你可以检查

WebSecurity.CurrentUserName, WebSecurity.CurrentUserId and , WebSecurity.IsAuthenticated flags;

于 2015-05-02T02:32:09.557 回答