2009-03-04 10 views
3

ASP.NET 웹 앱의 사용자를위한 명시 적 로그 아웃 버튼이 필요합니다. IIS6을 기본 인증 (SSL)과 함께 사용하고 있습니다. 다른 웹 페이지로 리디렉션 할 수 있지만 브라우저가 세션을 활성 상태로 유지합니다. 나는 인터넷 검색을 통해 액티브 X 컨트롤이 IIS와 통신하고 세션을 종료 할 수있게함으로써이를 수행하는 방법을 발견했습니다. 나는 폼 인증을 허용하지 않는 제한된 환경에 있으며 활성 x 컨트롤도 금지되어 있지 않습니다. 다른 사람이이 요구 사항을 가지고 있으며 어떻게 처리 했습니까?로그 오프 버튼 IIS6 ASP.NET 기본 인증

나는 그것이 두려웠다. 나는 그물에서 비슷한 대답을 보았고 나는 누군가가 그 일을 할 수있는 길을 가지기를 바랬다. 그래도 시간 내 주셔서 감사합니다. 나는 자바 스크립트를 사용하여 history.back() 같은 뒤로 버튼을 막을 수 있다고 생각한다.

답변

4

나는 몇 일 동안 함께 자신을 어려움을 겪고 있었다. 1) 예를 들어 사용자의 의지도 자신의 Gmail 또는 그가 현재 인증있어 다른 웹 사이트에서 로그 아웃 얻을 것을 의미, 모든 자격 증명을 플러시 : 특정 IE의 'document.execCommand('ClearAuthenticationCache');'를 사용

모든 사람에게 좋은 옵션이 아닙니다 2) 그것만 IE의;)

나는 Session.Abandon()을 사용하여 내 Default.aspx로 리디렉션하려고했습니다. 이것만으로는 충분하지 않습니다. 만들어진 요청이 승인되지 않았 음을 명시 적으로 브라우저에 알릴 필요가 있습니다. 당신은 같은 것을 사용하여이 작업을 수행 할 수 있습니다 : 이것은 다음 발생합니다

response.StatusCode = 401; 
response.Status = "401 Unauthorized"; 
response.AddHeader("WWW-Authenticate", "BASIC Realm=my application name"); 
resp.End(); 

: 사용자가 ==> 그 기본 로그인 창이 나타납니다 로그 아웃 버튼을 클릭합니다. 하지만 로그인 대화 상자가 사라지고 새로 고침을 누르면 브라우저는 자동으로 자격 증명을 다시 전송하여 사용자가 로그인 한 것으로 간주하지만 로그 아웃했다고 생각할 수 있습니다.

이 문제를 해결하려면 항상 고유 한 '영역'을 내야합니다.. 그런 다음 브라우저는 위에서 설명한 경우 자격 증명을 다시 보내지 않습니다. 나는 현재 날짜와 시간을 뱉어 버렸다.

response.StatusCode = 401; 
response.Status = "401 Unauthorized"; 
string realm = "my application name";     
response.AddHeader("WWW-Authenticate", string.Format(@"BASIC Realm={0} ({1})", realm, DateTimeUtils.ConvertToUIDateTime(DateTime.Now))); 
resp.End(); 

당신이해야 할 또 다른 한가지는 페이지 캐시하지 않도록 브라우저를 말씀이다 : 그것은 IE에서 (나를 위해) 작업 장소에서 모든 것을 함께

Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Cache.SetExpires(DateTime.MinValue); 
Response.Cache.SetNoStore(); 

,하지만 지금까지 내가 사용자가 처음 escape 키 (기본 로그인 대화 상자 숨기기)를 누른 다음 새로 고침 (F5) 또는 브라우저 다시 버튼을 누르면 사용자가 Firefox에 로그인하는 것을 방지 할 수 없었습니다.

0

버튼 클릭에 대한 응답으로 Session.Abandon을 호출 해 보았습니까?

편집 :이 보일 것입니다

고전 뒤로 버튼 문제입니다.

뒤로 버튼에 대해 수행 할 수있는 작업은 거의 없습니다. 사용자가 새 창에서 현재 페이지를 연 다음 logOut 버튼을 클릭했다고 가정하면 해당 페이지는 로그 아웃 된 것처럼 보이지만 다른 창에 즉시 영향을주지는 않습니다.

해당 창이 어딘가에 탐색하려고 할 때만 해당 세션이 사라 졌음이 분명해집니다.

많은 브라우저가 비슷한 (동일하지는 않지만) 뒤로 버튼을 구현합니다. 이전 페이지로 돌아가는 것은 반드시 HTML/HTTP 관점에서의 네비게이션 일 필요는 없습니다.

+0

내가 다시 클릭하면 나는 여전히 인증을받습니다. 보호 된 void logOut_Click (개체 보낸 사람, EventArgs 전자) { Session.Clear(); Session.Abandon(); ViewState.Clear(); FormsAuthentication.SignOut(); Response.Redirect ("http://www.google.org"); } – willyconnor

2

Session.Abandon 메서드는 Session 개체에 저장된 모든 개체를 파괴하고 해당 리소스를 해제합니다. Abandon 메서드를 명시 적으로 호출하지 않으면 서버는 세션 시간이 초과 될 때 이러한 개체를 소멸시킵니다.

+0

다시 클릭하면 아직 인증 된 상태입니다. 보호 된 void logOut_Click (개체 보낸 사람, EventArgs 전자) { Session.Clear(); Session.Abandon(); ViewState.Clear(); FormsAuthentication.SignOut(); Response.Redirect ("http://www.google.org"); } – willyconnor

+0

캐시 된 버전의 페이지를 보는 것 같습니다. 서버에서 새로 고침을 시도하면 세션이 만료되었음을 알 수 있습니다. –

+0

캐싱을 사용하지 않도록 설정할 수 있습니다. 어떻게 달성되는지를 설명하는 몇 가지 stackoverflow 질문이 있습니다. –

0

이것은 IE6 이상에서 작동하는이 문제에 대한 해결책입니다. 사용자가 확인하고 자신의 요청을 처리 한 후 제리 B.는 "쓰고, 내가 지금 원하는 :

<asp:LinkButton ID="LinkButton1" runat="server" OnClientClick="logout();">LinkButton</asp:LinkButton> 


<script> 

    function logout() 
    { 
    document.execCommand("ClearAuthenticationCache",false); 
    } 
</script> 

는 Q, 짧은 자격 증명에 http://msdn.microsoft.com/en-us/library/bb250510%28VS.85%29.aspx

웹 팀에서이 제발 찾을 수 이 머신이 누군가가 걸어 다닐 수있는 열린 환경에 있다고 가정하면, 사용자가 웹상의 특정 모듈에 액세스 할 때마다 새로운 도전을 던지고 싶습니다. "

A : 이것은 Internet Explorer 팀에서 자주 요청하는 기능이며 그 곳의 선량한 사람들은 Internet Explorer 6.0 SP1에서 수행 할 수있는 방법을 제공했습니다. 당신이해야 할 일은 다음과 같이 명령 매개 변수로 ClearAuthenticationCache 전달, 문서에서의 execCommand 메소드를 호출 할 수 있습니다 : 사용자가 자원을 요청하면되도록 캐시에

document.execCommand("ClearAuthenticationCache"); 

이 명령 플러시 모든 자격 증명을, 그 인증이 필요하면 인증 확인 메시지가 다시 나타납니다.

내 로그 아웃 링크 버튼이 넣고는 IE6 SP1의 작동 및 이상 :

OnClientClick="document.execCommand('ClearAuthenticationCache');" 
관련 문제