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((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、および WebSecurity.IsAuthenticated フラグ。

于 2015-05-02T02:32:09.557 に答える