2009-11-10 5 views
3

ASP.NET MVC에서 응용 프로그램을 쓰고 있습니다. 기본적으로 사용자 인증이 필요한 페이지가 있습니다. 사용자 로그온시 사용자 행을 세션에 보관합니다. 그래서 내 컨트롤러에서 여분의 쿼리를하지 않고도 user.ID에 액세스 할 수 있습니다.Asp MVC, 솔루션 구축시 세션 손실이 있습니까?

프로젝트가 디버그 모드에있는 경우보기의 내용 만 변경할 수 있습니다. 컨트롤러에는 없습니다.

디버깅 중이 지 않은 경우 솔루션을 빌드하고 프로젝트를 실행하지 않고 만든 변경 사항을 볼 수 있습니다 (F5 키 사용). BUT, 내가 가진 모든 세션 변수를 잃어 버립니다.

기본적으로 컨트롤러에 작은 변화가 생길 때마다 로그 오프해야합니다. 변경 사항을 보려면 로그온해야합니다.

정상적인 행동입니까?

답변

2

이 정상적인 동작입니다. 더 쉽게 (그리고 약간 더 강력하게) 코드를 약간 변경하면됩니다. 물론 이것은 인증 될 때 Controller.User.Identity.Name을 통해 사용자 ID에 액세스 할 수 있으므로 세션에 사용자 ID 이상을 저장한다고 가정합니다. 따라서 세션 객체에서 추가 데이터 조회를 수행하고 null을 반환하지 않으면이를 사용합니다. null를 돌려주는 경우는, User ID에 근거 해 추가 정보를 검색해, 세션에 그 정보를 다시 포함합니다. 이것은 Active Directory에서 정보를 저장하기 위해 취하는 접근 방식이며 훌륭하게 작동합니다.

+0

예 제가 할 것입니다. 하지만 모든 페이지에서 사용자 세부 정보를 얻기 위해 데이터베이스를 쿼리하는 데 집중적이지 않습니까? – gong

+0

그런 이유로 먼저 세션을 확인합니다. Session이 null 인 경우에만 DB를 쿼리합니다. –

2

예, 이것은 MVC뿐만 아니라 ASP.NET의 일반적인 동작입니다.

디버그에서 실행할 때 새 세션을 작성해야합니다 (예 : 컨트롤러 또는 비즈니스 객체의 변경). 말했듯이, 재 컴파일을 필요로하지 않는보기 또는 페이지의 변경 만이 동일한 세션에서 변경 사항을 볼 수 있습니다.

친절,

댄처럼 댄 언급

+0

그래서 큰 프로젝트를 어떻게 디버그합니까? 변경 사항을보기 위해 항상 로그 오프, 로그 온 하시겠습니까? 사용자 세부 정보를 다른 곳에 보관할 수 있습니까? 예를 들어 Request.IsAuthenticated는 세션이 손실되었다는 사실 외에도 true입니다. 거기에 몇 가지 자격 증명을 저장할 수 있습니까? – gong

+0

@ gong 정보를 다루기위한 아래의 제 응답을보십시오. –

1

다시 컴파일하면 현재 세션 데이터가 모두 지워집니다. 그러나 인증 티켓을 지우지 않아 쿠키로 저장되므로이를 피하기 위해 할 수있는 몇 가지 방법이 있습니다. 당신은 단지 사용자 ID에 액세스해야하는 경우에만 다음 세션 쿠키에 그것을 저장할 수있는 등 사용자의 이름으로 표시 목적에 대한 기본 사용자 데이터를 필요한 경우 User.Indentity.Name

  • 를 사용

    1. . 경고 : 쿠키 데이터를 암호화하지 않으면 일반 데이터 쿠키 데이터를 신뢰할 수 없어야 데이터를 표시 할 수 있습니다.

    2. 사용자 데이터는

    은 기본 컨트롤러 또는 확장 방법

    protected UserData GetUserData() { 
        UserData user = HttpContext.Session["User"] as UserData; 
        if (user == null) { 
        user = UserDataRepository.GetUser(User.Identity.Name); 
        HttpContext.Session.Add("User", user); 
        } 
        return user; 
    } 
    
    이 같은 추가 Agent_9191

    에 의해 제안 그 다음 캐싱을 사용하는 방법을 통해 데이터에 액세스보다 더 복잡한 경우