[asp.net] FormsAuthentication.SignOut ()이 사용자를 로그 아웃하지 않습니다.

이것에 대해 너무 오랫동안 내 머리를 부 mash 버렸다. FormsAuthentication.SignOut을 사용하여 로그 아웃 한 후 사용자가 사이트 페이지를 탐색하지 못하게하려면 어떻게합니까? 나는 이것을 할 것으로 기대합니다 :

FormsAuthentication.SignOut();
Session.Abandon();
FormsAuthentication.RedirectToLoginPage();

그러나 그렇지 않습니다. URL을 직접 입력해도 여전히 페이지를 탐색 할 수 있습니다. 한동안 롤업 보안을 사용하지 않았기 때문에 왜 이것이 작동하지 않는지 잊어 버렸습니다.



답변

전화를 걸 때 쿠키가 지워지지 않고 FormsAuthentication.SignOut()새 요청마다 인증 되기 때문에 사용자는 여전히 웹 사이트를 탐색 할 수 있습니다 . MS 문서에서 쿠키는 지워지지 만 쿠키는 지워지지 않는다고 말합니다. Session.Abandon()쿠키 와 정확히 동일합니다 . 쿠키는 여전히 있습니다.

코드를 다음과 같이 변경해야합니다.

FormsAuthentication.SignOut();
Session.Abandon();

// clear authentication cookie
HttpCookie cookie1 = new HttpCookie(FormsAuthentication.FormsCookieName, "");
cookie1.Expires = DateTime.Now.AddYears(-1);
Response.Cookies.Add(cookie1);

// clear session cookie (not necessary for your current problem but i would recommend you do it anyway)
SessionStateSection sessionStateSection = (SessionStateSection)WebConfigurationManager.GetSection("system.web/sessionState");
HttpCookie cookie2 = new HttpCookie(sessionStateSection.CookieName, "");
cookie2.Expires = DateTime.Now.AddYears(-1);
Response.Cookies.Add(cookie2);

FormsAuthentication.RedirectToLoginPage();

HttpCookieSystem.Web네임 스페이스. MSDN 참조 .


답변

x64igor와 Phil Haselden의 위의 두 가지 게시물을 사용하여 이것을 해결했습니다.

1. x64igor가 로그 아웃을 수행하는 예제를 제공했습니다.

  • 먼저 응답의 빈 쿠키를 로그 아웃으로 전달 하여 인증 쿠키 및 세션 쿠키 를 지워야합니다.

    public ActionResult LogOff()
    {
        FormsAuthentication.SignOut();
        Session.Clear();  // This may not be needed -- but can't hurt
        Session.Abandon();
    
        // Clear authentication cookie
        HttpCookie rFormsCookie = new HttpCookie( FormsAuthentication.FormsCookieName, "" );
        rFormsCookie.Expires = DateTime.Now.AddYears( -1 );
        Response.Cookies.Add( rFormsCookie );
    
        // Clear session cookie 
        HttpCookie rSessionCookie = new HttpCookie( "ASP.NET_SessionId", "" );
        rSessionCookie.Expires = DateTime.Now.AddYears( -1 );
        Response.Cookies.Add( rSessionCookie );

2. Phil Haselden은 로그 아웃 후 캐싱을 방지하는 방법을 위의 예에서 설명했습니다.

  • 응답을 통해 클라이언트 측에서 캐시무효화 해야합니다 .

        // Invalidate the Cache on the Client Side
        Response.Cache.SetCacheability( HttpCacheability.NoCache );
        Response.Cache.SetNoStore();
    
        // Redirect to the Home Page (that should be intercepted and redirected to the Login Page first)
        return RedirectToAction( "Index", "Home" );
    }

답변

에 web.config 인증 섹션이 제대로 설정되지 않은 것 같습니다. 예는 아래를 참조하십시오.

<authentication mode="Forms">
  <forms name="MyCookie" loginUrl="Login.aspx" protection="All" timeout="90" slidingExpiration="true"></forms>
</authentication>
<authorization>
  <deny users="?" />
</authorization>


답변

여기서 핵심은 “URL을 직접 입력하면 …”이라고 말합니다.

기본적으로 폼 인증에서 브라우저는 사용자의 페이지를 캐시합니다. 따라서 브라우저 주소 상자 드롭 다운에서 직접 URL을 선택하거나 입력하면 브라우저 캐시에서 페이지를 가져올 수 있으며 서버로 돌아가 인증 / 권한을 확인하지 않아도됩니다. 이에 대한 해결책은 각 페이지의 Page_Load 이벤트 또는 기본 페이지의 OnLoad ()에서 클라이언트 측 캐싱을 방지하는 것입니다.

Response.Cache.SetCacheability(HttpCacheability.NoCache);

당신은 또한 전화를 원할 수도 있습니다 :

Response.Cache.SetNoStore();


답변

나는 전에도 이것으로 고투했다.

여기에 무슨 일이 일어나고 있는지에 대한 비유가 있습니다 … 새로운 방문자 Joe가 사이트에 와서 FormsAuthentication을 사용하여 로그인 페이지를 통해 로그인합니다. ASP.NET은 Joe의 새 ID를 생성하고 쿠키를 제공합니다. 그 쿠키는 집 열쇠와 같으며 Joe가 그 열쇠로 돌아 오는 한 자물쇠를 열 수 있습니다. 각 방문자에게는 새로운 열쇠와 새로운 자물쇠가 제공됩니다.

경우 FormsAuthentication.SignOut()라고합니다, 시스템은 키를 분실 할 조를 알려줍니다. Joe는 더 이상 열쇠를 가지고 있지 않기 때문에 정상적으로 작동합니다.

조 다시 돌아오고, 그러나 않는 그 잃어버린 열쇠를 가지고, 그는 다시하자입니다!

내가 알 수 있듯이 ASP.NET에 자물쇠를 변경하도록 지시 할 수있는 방법이 없습니다!

내가 이것을 살 수있는 방법은 세션 변수에서 Joe의 이름을 기억하는 것입니다. 그가 로그 아웃 할 때 세션을 포기하므로 ​​더 이상 그의 이름이 없습니다. 나중에 허용 여부를 확인하기 위해 자신의 Identity.Name을 현재 세션의 항목과 비교하고 일치하지 않으면 유효한 방문자가 아닙니다.

즉, 웹 사이트의 경우 User.Identity.IsAuthenticated세션 변수를 확인하지 않고 의존하지 마십시오 !


답변

많은 검색 후 마침내 이것은 나를 위해 일했습니다. 도움이 되길 바랍니다.

public ActionResult LogOff()
{
    AuthenticationManager.SignOut();
    HttpContext.User = new GenericPrincipal(new GenericIdentity(string.Empty), null);
    return RedirectToAction("Index", "Home");
}

<li class="page-scroll">@Html.ActionLink("Log off", "LogOff", "Account")</li>


답변

이것은 나를 위해 작동

public virtual ActionResult LogOff()
    {
        FormsAuthentication.SignOut();
        foreach (var cookie in Request.Cookies.AllKeys)
        {
            Request.Cookies.Remove(cookie);
        }
        foreach (var cookie in Response.Cookies.AllKeys)
        {
            Response.Cookies.Remove(cookie);
        }
        return RedirectToAction(MVC.Home.Index());
    }