2013-04-22 4 views
7

특정 조건에 따라 OnActionExecuting에 사용자 지정 동작 필터가 있으며 사용자를 로그 아웃하고 사이트의 홈 페이지로 리디렉션합니다. 리디렉션 부분 (뒤로 벗겨) 코드 나도 tempData 메시지를 설정하고, 이와 같이ActionFilterAttribute 내에서 TempData 설정

filterContext.Controller.TempData.Add("key", "Message"); 

    filterContext.Result = new RedirectResult("/"); 

이하이다. 사용자가 로그 아웃 되었기 때문에 홈 페이지를 방문하면 [Authorize] 속성이 로그인 GET 페이지로 리디렉션됩니다. 로그인보기에서 나는 tempData 내에서 모든 메시지를 표시합니다. 그러나이 상황에서는 tempData가 비어 있습니다.

이것은 로그인 POST가 작동하는 방식과 매우 유사합니다 (유효하지 않은 경우 로그인으로 리디렉션되어 로그인 게시물에 설정된 tempData 메시지를 표시하는 가정으로 리디렉션됩니다). 이 코드는 내가 아니라이 코드가 여러 사이트에 분산되어 있기 때문에 로그인 페이지로 특별히 리디렉션보다, 이런 식으로 일을 오전

TempData.Add("key", errorMessage); 

    return Redirect("/")); 

이유는 아래에 볼 수있다, 그래서 우리는 로그인 GET URL이 무엇인지 잘 모릅니다 .

누군가가 로그인 POST에는 작동하지만 ActionFilter 리디렉션에는 작동하지 않는 이유에 대한 정보가 있습니까?

편집 :

난 사용자 지정 작업 필터 내에서 로그 아웃 호출을 제거하면 tempData 여전히 홈 액션 내에서 설정 - 액션 필터는 로그인 POST 작동 왜 그러나이 나던 설명하지만?

답변

4

그래서 나는 시스템에서 사용자를 로그 아웃 할 때 세션을 포기하고 (HttpContextBase.Session.Abandon()) 쿠키 세션 ID를 재설정했음을 알 수 있습니다. 이것들은 TempData 동작에 영향을 미쳤습니다. 이러한 호출을 제거하면 tempData가 올바르게 설정되고 표시됩니다.

-1

결과를 new RedirectResult("/")으로 설정하면 현재 서버 처리가 중지되고 클라이언트에게 클라이언트에게 새로운 URL (RedirectResult에서 말한 URL)을 요청하는 응답을 보냅니다. 그런 다음 두 번째 요청은 다르며 이전 처리의 값을 포함하지 않습니다. 동일한 클라이언트 요청에서 새 경로를 처리하려면 Redirect("/"); 또는 Server.Transfer("/");을 사용해보십시오.

+0

내가하는 행동은 다음과 같습니다. 클라이언트가 새 URL을 요청하도록합니다. TempData가 비어있는 이유는 세션을 포기했기 때문입니다. – Rob