2013-07-12 3 views
1

그래서 이상한 일이 일어나서 그 원인을 정확하게 파악할 수 없습니다. 내 asp.net 프로젝트는 다음 명령을 사용하여 동기화되는 두 개의 프로덕션 서버에 세션 상태와 연결되어 :viewstate MAC에 대한 유효성 검사가 실패했지만 2 개의 Webfarm 서버 중 1 개에서만 발생합니다. (컴퓨터 키가 정확함)

msdeploy -verb:sync -source:webserver,computername=%MACHINE%,username=Administrator,password=%PASSWORD% -dest:webserver 2<&1 

응용 프로그램은 2008 R2의 웹 서버 비하인드 두 서버에서 실행되는 asp.net 4.0 웹 사이트입니다 사용자가 연결되면 한 서버에만 고정하도록 설정된 부하 분산 구성. <MachineKey>은 응용 프로그램 루트 사이트에서 유효성 검사 및 암호 해독 키로 하드 코드 된 것으로 설정되어 있으며 두 서버간에 동일합니다. 내 응용 프로그램은 예외 이벤트를 전자 메일 시스템에 전달하도록 설정됩니다.

무슨 일이 벌어지고 있는지 나는 무서워하는 'viewstate MAC의 검증'을 서버에서 받았지만 서버로드가 50/50으로 나뉘어져 있어도 99/1 스플릿에서 오류가 발생하고 있습니다. 그래서 한 웹 서버가 다른 웹 서버보다 훨씬 더 자주 이러한 오류를 생성합니다. 서버가 동기화되고 모든 구성이 동일하다는 점을 고려하면 이상합니다.

이 문제에 대한 광범위한 검색을 수행 했으므로 언급하지 않거나 다음을 수행하는 솔루션을 찾기가 매우 어려워 보입니다.

  • <MachineKey>은 서버간에 동일하지 않습니다. (사실 이것은 내 문제가 아님)
  • enableViewStateMac=false 또는 사이트 보안을 위험에 빠뜨릴 수있는 다른 설정을 지정합니다.
  • 폼 입력의 모든 액션 태그는 사용자가 이전의 페이지를 클릭하면 (그들이)
  • 를 서버의 인스턴스 ID가 동일해야합니다 그들은
  • 에 배치 같은 페이지를 참조하는지 확인 전체 페이지 (viewstate)가 다운로드되었습니다 (내 viewstate가 페이지의 맨 위에 렌더링되도록 설정 됨). Response.Redirect를하고 Server.Transfer를

  • 문제는 지금은 모든 가능한 원인으로 지난 제외하고 제거했다. 내 응용 프로그램은 문제없이 1 년 넘게 정상적으로 실행되었으며 이러한 오류가 발생하기 전에 SQL 세션 상태를 사용하고 .NET 3.5에서 .NET 4.0으로 프로젝트를 마이그레이션 한 다음 서버 모드 배포 모드를 소매로 설정했습니다. 나는 응용 프로그램 풀을 재활용하고 'iis 재설정'을 수행하지 않으려 고 노력했습니다.

    다른 사람이 내가 무엇을 볼 수 있는지에 대한 제안 사항이 있습니까? 요점은 내가 할 내 사이트의 보안 구멍을 열어서이 문제를 해결하고 싶습니다.

    사용자가 처음 로그인 할 때 양식 인증을 사용하여 인증 한 직후 사용자에게이를 알리지 못하는 것으로 보입니다. 나는 또한 이것이 캐싱과 관련이 있다는 이론을 가지고 있지만 이것 역시 확신 할 수 없다. 여기

    내 Web.config의에서 수분이 비트는

    <system.web> 
        <httpRuntime requestValidationMode="2.0"/> 
        <globalization culture="en-US" uiCulture="en-US" resourceProviderFactoryType="WebResourceFactory"/> 
        <compilation debug="true" defaultLanguage="c#" explicit="true" strict="true" targetFramework="4.0"> 
         <assemblies> 
         </assemblies> 
        </compilation> 
        <authentication mode="Forms"> 
         <forms name=".ASPXAUTH" loginUrl="Login.aspx" protection="All" slidingExpiration="true"/> 
        </authentication> 
        <authorization> 
         <deny users="?"/> 
        </authorization> 
        <sessionState mode="SQLServer" sqlConnectionString="connection" compressionEnabled="true" /> 
        <pages theme="Blue" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"> 
    <machineKey validationKey="key" decryptionKey="key" decryption="3DES" validation="SHA1" /> 
        </system.web> 
    

    EDIT (내가 몇 가지 중요한 정보를 제거한)입니다 : 내가 경로를 사용자에게 선호 설정로드 밸런서와 SQL 세션 상태를 사용하고 있음을 강조 그들이 시작한 서버로

  • +0

    +1 나는 슬프게도이 문제에 대한 "수정"으로 너무나 자주 보게되는 보호 기능을 비활성화하기보다는 도움을 요청하고 자세한 질문을합니다. – pwdst

    답변

    0

    좋아, 나는 정확하게 그것을 일으키는 것을 분별할 수 없지만, 나는 누군가가이 문제가 나중에 나올 때를 대비하여 모든 단계를 나열 할 것이다.

    1 : 설치된 이러한 Windows 업데이트 :

    enter image description here

    2 enter image description here

    : 내 폼 인증 쿠키가 지속로 설정하지만 내 세션 쿠키는 브라우저 세션으로 설정했다. 내 양식 인증 쿠키를 브라우저 세션 기반으로 설정했습니다.

    3 : 사이트 구성에서 IIS의 루트로 my를 복사했습니다. 모든 문서에서 IIS가 여러 사이트/응용 프로그램에 대해 여러 컴퓨터 키를 지원해야하므로이 작업을 수행 할 필요가 없습니다.

    4 : 서버를 재부팅했습니다.

    그게 전부 야! 그 이후로 오류를받지 못했습니다.

    0

    목록에 추가하지 않았을 가능성이 있습니다 (ViewStateUserKey).

    ViewStateUserKey가 로그온시 세션 ID로 설정되고 (중요한) 세션에 데이터가 저장되기 전에 응용 프로그램에서 문제가 발생했습니다. 하나 이상의 개체가 세션에 저장 될 때까지 ASP.NET은 세션 ID를 유지하지 않으므로 ID가 계속 변경되고 Viewstate가 유효성 검사에 실패했습니다. 세션에 무언가를 저장 했더라도 상태 기반 서버 나 SQL 세션 저장소가 아닌 기본 in-process 모델을 사용하는 경우 각 서버에서 세션이 달라집니다. ViewStateUserKey와 함께 사용되는 서버에서 쉽게 예측할 수없는 서버 특정 값이나 값은 물론이 문제를 일으킬 수 있습니다.

    그렇지 않으면 내가 본 이슈의 가장 보편적 인 원인은 이 아닌 인 양식 (예 : PHP 또는 HTTP에서 추상화를 시도하지 않는 플랫폼) 또는 다중 서버 환경의 Web.config에서 Machine Key 특성이 누락 된 것입니다.

    +0

    고마워요. 이것에 대해 살펴 보겠습니다.하지만 SQL 세션 상태를 사용하고 있다는 것을 분명히하지는 않았지만 부하 분산 장치를 사용하여 한 대의 컴퓨터에서 사용자를 유지하려고합니다. –

    +0

    나는 당신이 SQL 세션 저장소를 사용하고 있다는 것을 알고 있었지만 (답변에서 언급했듯이), 완전성을 위해서 그리고 동일한 문제가 발생했을 가능성이 있고 그 세션에 대해 알지 못하는 다른 사용자들에 대해 언급했다. - 프로세스. 사용중인 세션 저장소 메커니즘에 관계없이 ASP.NET은 하나 이상의 항목이 세션에 저장 될 때까지 동일한 세션 ID를 유지하지 않습니다. 이 ID를 변경하거나 서버간에 변경되는 다른 ViewStateUserKey 값을 설정하면 설명하는 문제가 발생할 수 있습니다. – pwdst

    +0

    그래서 나는 그것을 들여다 보았고 ViewStateUserKey가 내 솔루션에 전혀 설정되어 있지 않습니다. 내가 가서 어쨌든 설정해야합니까? viewstateencryption 설정을 'always'로 생각했습니다. –