6

安全な部分、つまり「PIP」という名前のフォルダーを使用して Web サイトを開発しています。

ログイン部分は正常に動作しますが、ログオフをクリックすると、ユーザーはまだ認識されており、安全な部分に触れてもログイン ページにリダイレクトされません。

これが私のweb.configです:

<system.web>

<authentication mode="Forms">
  <forms loginUrl="Login.aspx" name=".ASPXFORMSAUTH">
  </forms>
</authentication>

</system.web>

<location path="PIP">
<system.web>
  <authorization>
    <deny users="?" />
  </authorization>
</system.web>
</location>

ユーザーが認証される私のログインページ:

FormsAuthentication.RedirectFromLoginPage(uid, false);

セキュリティで保護されたフォルダー (PIP) の default.aspx ページには、ログオフ ボタンがあり、そのボタンの背後にあるコードは次のとおりです。

FormsAuthentication.SignOut();
Response.Redirect("~/Default.aspx", true);

ページ "Default.aspx" は、~/PIP/Default.aspx に移動するリンクです。ログイン ページにリダイレクトする必要がありますが、そうではありません。セッションはサインアウトの影響を受けないようです。

セッションを手動で削除して、多くのオプションを試しました。Session.Clear、Session.Abandon ですが、何も機能していないようです。

皆さんが私を正しい方向に向けてくれることを願っています!

前もって感謝します。

4

4 に答える 4

4

サインアウトした後、セッションを放棄する必要があります。

FormsAuthentication.SignOut();
Session.Abandon();
Response.Redirect("~/Default.aspx", true);
于 2012-07-30T10:09:17.510 に答える
2

サインアウト前、サインアウト中、またはサインアウト後に、IEの他のインスタンスを開いていますか?そうでない場合は、CookieがIEの共有Cookie要素にまだ存在していることがわかります。

Webページに有効期限が設定されていますか?そうでない場合、ページはブラウザのキャッシュに残っている可能性があり、サーバーのフォーム認証チェックは呼び出されません。

ブラウザを閉じて保護されたリソースに再度アクセスしてログインする必要がある場合は、正しく構成されています。セッションCookieはフォーム認証プロセスの一部として使用されないため、心配する必要はありません-FormsAuthentication .SignOut()は、これを行う正しい方法です。

Global.asax.csに、次のイベントハンドラーを追加し(まだ持っていない場合)、ブレークポイントを設定します。LogOffを呼び出した後で後続のリクエストのブレークポイントに到達した場合は、Cookieをクラックして開き、その内部を確認できます。リクエストはキャッシュから提供されるため、このブレークポイントに到達しないと思います。

    protected void Application_BeginRequest(object sender, EventArgs e) 
    {}

クッキーをクラックして開くには:

                HttpRequest currentRequest = HttpContext.Current.Request;

            // Attempt to get the Forms Auth Cookie from the Request
            HttpCookie authenticationCookie = currentRequest.Cookies[FormsAuthentication.FormsCookieName];

            if(authenticationCookie != null)
            {
                // Crack the Cookie open
                var formsAuthenticationTicket = FormsAuthentication.Decrypt(authenticationCookie.Value);

                // breakpoint here to see the contents of the ticket.
                if (formsAuthenticationTicket.Expired)
                {

                }
            }

FirefoxまたはChromeでこれを試すことも価値があります。これは、Cookieをすぐに取り除くのに優れているように見えるためです。

キャッシュを無効にするには、次のページの1つに次のように入力します。

    private static void SetImmediateExpiryOnResponse(HttpResponse response)
    {
        response.Cache.SetAllowResponseInBrowserHistory(false);
        response.Cache.SetCacheability(HttpCacheability.NoCache);
        response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
        response.Cache.SetNoStore();
        response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        response.Expires = -1;
        response.ExpiresAbsolute = DateTime.Now.AddDays(-1);
        response.CacheControl = "no-cache";
    }
于 2012-07-30T11:11:17.647 に答える
2

期限切れの Cookie を設定します。

HttpCookie cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
cookie.Expires = DateTime.Now.AddYears(-1);
HttpContext.Current.Response.Cookies.Add(cookie);
于 2015-08-03T12:36:38.307 に答える
0

Using the LoginView Control may solve your problem.

One of my website have this configuration on web.config

<authentication mode="Forms">
        <forms loginUrl="~/Login.aspx" protection="All" timeout="30" name=".ASPXAUTH" path="/" requireSSL="false" slidingExpiration="true" 
               defaultUrl="Login.aspx" cookieless="UseDeviceProfile" enableCrossAppRedirects="false"/>
    </authentication>

Then in my protected area i've created a new web.config with only this few lines :

<configuration>
  <system.web>
    <authorization>
      <deny users="?"/>
    </authorization>
  </system.web>
</configuration>

And in the MasterPage i use the LoginView Control :

<asp:LoginView ID="HeadLoginView" runat="server" EnableViewState="false">
      <AnonymousTemplate>
        <a href="../LoginReservedArea.aspx">Area Clienti</a>
        <%--[ <a href="~/Login.aspx" ID="HeadLoginStatus" runat="server">Log In</a> ]--%>
    </AnonymousTemplate>
    <LoggedInTemplate>
        Welcome <asp:LoginName ID="HeadLoginName" runat="server" />
        [<asp:LoginStatus ID="HeadLoginStatus" runat="server" LogoutAction="RedirectToLoginPage" LogoutText="Log Out" />]
    </LoggedInTemplate>
</asp:LoginView>

Here there is a reference to loginview control and you can read that

Logging out of the Web site clears the user's authentication status and when using cookies will clear the cookie from the user's client computer.

So i think that if you don't use the loginview control you have to clear the cookie manually.

于 2012-07-30T10:02:26.453 に答える