Microsoft로 로그인
로그인하거나 계정을 만듭니다.
안녕하세요.
다른 계정을 선택합니다.
계정이 여러 개 있음
로그인할 계정을 선택합니다.

ASP .NET 지원 음성 열

양식 인증 문제 해결

ASP.NET 지원 음성 열에 오신 것을 환영합니다! 제 이름은 제리 오먼입니다. 저는 5년 이상 Microsoft와 함께 해왔으며 대부분의 시간을 Microsoft FrontPage 및 새로운 Microsoft SharePoint 기술과 같은 웹 관련 기술에 집중했습니다. 지난 1년 동안 Microsoft ASP.NET 지원 엔지니어로 일했습니다. 이번 달에는 지원 음성 열에서 Microsoft ASP.NET 양식 인증 문제를 해결하는 방법을 설명하겠습니다.

양식 인증 문제 해결

ASP.NET 애플리케이션에서 Forms Authentication을 사용하는 경우 사용자가 로그인 페이지로 임의로 리디렉션될 때 발생하는 문제를 해결해야 할 수 있습니다. 이상적인 환경에서 이 문제는 디버거를 쉽게 연결하고 문제를 캡처할 수 있는 방식으로 발생합니다. 그러나 프로덕션 환경에서는 거의 그렇지 않습니다. 이와 같은 임의 문제를 해결하려면 근본 원인을 좁힐 수 있도록 문제와 관련된 정보를 기록해야 합니다.

이 열에서는 양식 인증 개념을 간략하게 설명합니다. 그런 다음 사용자가 로그인 페이지로 리디렉션되는 시나리오와 문제 격리와 관련된 데이터를 캡처하는 방법을 살펴보겠습니다. 또한 IHttpModule 인터페이스를 구현하여 양식 인증 정보를 기록하는 방법도 설명합니다.

양식 인증 개요

사용자가 Forms 인증을 사용하여 웹 사이트에 인증하면 서버에서 쿠키를 만듭니다. 쿠키의 값은 암호화된 양식 인증 티켓입니다. 쿠키는 애플리케이션에 대한 각 요청의 서버에 전달되고 FormsAuthenticationModule 클래스는 쿠키 값을 해독하고 사용자가 유효한지 여부를 확인합니다.

기본적으로 FormsAuthenticationModule 클래스는 Machine.config 파일에 추가됩니다. FormsAuthenticationModule 클래스는 FormsAuthentication 프로세스를 관리합니다.

다음은 Machine.config 파일의 항목입니다.

<httpModule>
     …other modules…
     <add name="FormsAuthentication"
         type="System.Web.Security.FormsAuthenticationModule" />
     …other modules…
</httpModule>

Forms 인증을 사용하여 인증하기 위한 일반 HTTP 트래픽은 다음과 유사합니다.

  1. 클라이언트는 HTTP GET을 Default.aspx로 보냅니다. 양식 인증 쿠키가 전송되지 않습니다.

  2. 서버는 Login.aspx에 302 응답(리디렉션)을 보냅니다.

  3. 클라이언트는 LOGin.aspx에 HTTP POST를 보냅니다. 여기에는 로그인 정보가 포함됩니다.

  4. 서버는 Default.aspx에 302 응답(리디렉션)을 보냅니다. 양식 인증 쿠키가 포함됩니다.

  5. 클라이언트는 HTTP GET을 Default.aspx로 보냅니다. 여기에는 양식 인증 쿠키가 포함됩니다.

양식 인증 구현 및 사용에 대한 자세한 내용은 다음 MSDN 웹 사이트를 참조하세요.

http://msdn2.microsoft.com/en-us/library/7t6b43z4.aspx

http://msdn2.microsoft.com/en-us/library/system.web.security.formsauthentication(vs.71).aspx

http://msdn2.microsoft.com/en-us/library/system.web.security.formsauthenticationket(vs.71).aspx양식 인증 쿠키 공유에 대한 자세한 내용은 다음 ASP.NET 웹 사이트를 참조하세요.

http://quickstarts.asp.net/QuickStartv20/aspnet/doc/security/formsauth.aspx

사용자가 로그인 페이지로 리디렉션될 수 있는 이유

양식 인증 쿠키가 손실되었습니다.

시나리오 1


이 시나리오에서는 사용자가 웹 사이트에 로그온합니다. 어떤 시점에서 클라이언트는 서버 및
에 요청을 보냅니다. FormsAuthenticationModule 클래스는 쿠키를 받지 않습니다. iiS(Microsoft 인터넷 정보 서비스)에서 쿠키 로깅을 사용하도록 설정하여 사용자 요청에 쿠키가 포함되어 있지 않은지 확인할 수 있습니다. 이렇게 하려면 다음 단계를 수행합니다.

  1. IIS MMC(Microsoft Management Console)를 엽니다.

  2. 웹 사이트를 마우스 오른쪽 단추로 클릭한 다음속성을 클릭합니다
    .

  3. 웹 사이트 탭을 클릭한 다음 로깅 사용을 클릭합니다.

  4. 로그 형식이 W3C 확장 로그 파일 형식인지 확인합니다.

  5. 속성을 클릭합니다.

  6. 고급 탭을 클릭한 다음확장 속성을 클릭합니다
    .

  7. 확장 속성에서 쿠키(cs(쿠키)) 검사 상자와 참조자(cs(참조자)) 검사 상자를 클릭하여 선택합니다.

이 문제가 발생한 후 문제가 있는 클라이언트와 해당 클라이언트의 IP 주소를 확인합니다. 해당 클라이언트의 IP 주소에서 IIS 로그를 필터링하고 <쿠키> 열을 봅니다.

참고 Log Parser를 사용하여 IIS 로그를 구문 분석할 수 있습니다. Log Parser를 다운로드하려면 다음 Microsoft 웹 사이트를 방문하세요.

http://www.microsoft.com/download/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07 해당 특정 사용자의 요청 목록이 있으면 로그인 페이지에 대한 요청을 검색합니다. 이 페이지로 리디렉션된 것을 알고 있으며 리디렉션이 발생하기 전에 요청을 확인하려고 합니다. 다음과 유사한 항목이 표시되면 클라이언트가 쿠키를 보내지 않았거나 클라이언트와 서버 간의 네트워크에서 쿠키가 제거되었습니다.

초기 로그인입니다.

방법

페이지

응답

쿠키

가져오기

/Default.aspx

302(리디렉션)

쿠키 없음

가져오기

/Login.aspx

200(성공)

쿠키 없음

올리기

/Login.aspx

302(리디렉션)

쿠키 없음

가져오기

/Default.aspx

200(성공)

. ASPXAUTH

가져오기

/SomePage.aspx

302(리디렉션)

아니요. ASPXAUTH 쿠키

이러한 요청은 다른 요청이며, 그 다음에는 가 없는 사이트의 페이지에 대한 요청이 뒤따릅니다. ASPXAUTH 쿠키.

방법

페이지

응답

쿠키

가져오기

/SomePage.aspx

302(리디렉션)

아니요. ASPXAUTH 쿠키

가져오기

/Login.aspx

200(성공)

아니요. ASPXAUTH 쿠키

올리기

/Login.aspx

302(리디렉션)

아니요. ASPXAUTH 쿠키

가져오기

/SomePage.aspx

200(성공)

. ASPXAUTH


참고 영구 쿠키를 만들지 않는 한 해당 사용자의 첫 번째 요청에는 양식 인증 쿠키가 있을 가능성이 없습니다. IIS 로그는 요청에서 수신된 쿠키만 표시합니다. 양식 인증 쿠키를 사용하는 첫 번째 요청은 성공적인 로그인 시도 후 요청에 있습니다.

시나리오 2


양식 인증 쿠키는 클라이언트의 쿠키 제한을 초과하는 경우에도 손실될 수 있습니다. Microsoft 인터넷 Explorer 쿠키는 20개로 제한됩니다. 클라이언트에서 20번째 쿠키를 만든 후 이전 쿠키가 클라이언트의 컬렉션에서 제거됩니다. 이면 입니다. ASPXAUTH 쿠키가 제거되면 사용자는 다음 요청이 처리될 때 로그인 페이지로 리디렉션됩니다.

이러한 두 시나리오의 문제를 동일한 방식으로 해결할 수 있습니다. 로그인 페이지로 리디렉션하기 직전에 요청을 확인합니다. 이 페이지에 대한 요청이 쿠키를 생성하는 경우 조사할 내용입니다.

Fiddler를 사용하여 클라이언트로 전송되는 HTTP 헤더를 볼 수 있습니다. 트래픽을 캡처한 후 요청을 두 번 클릭한 다음 헤더를 클릭하여 Set-Cookie 헤더를 확인합니다. 성공적인 로그인을 추적하는 경우 성공적인 로그인의 응답에 Set-Cookie 헤더가 표시됩니다.

Fiddler를 다운로드하려면 다음 Fiddler 웹 사이트를 방문하세요.

http://www.fiddlertool.com/fiddler/

시나리오 3


요청이 클라이언트를 떠난 후 전송되는 패킷에 영향을 줄 수 있는 다양한 계층이 있습니다. 네트워크 디바이스가 쿠키를 제거하는지 확인하려면 클라이언트와 서버에서 네트워크 추적을 캡처한 다음 쿠키에 대한 요청 본문을 확인해야 합니다. 클라이언트 요청을 확인하여 쿠키가 전송되었는지 확인하고 서버 추적을 검사 서버가 쿠키를 수신했는지 확인하려고 합니다.

클라이언트 요청

사용자가 인증된 후 GET 요청입니다. 양식 인증 티켓 정보가 파란색으로 강조 표시됩니다. 이렇게 하면 쿠키 정보가 클라이언트를 떠났습니다. Netmon과 같은 네트워크 캡처 도구를 사용하면 실제로 어댑터를 통과한 트래픽이 표시됩니다.

47 45 54 20 68 74 74 70-3a 2f 2f 6c 6f 63 61 6c   GET http://local
68 6f 73 74 2f 46 6f 72-6d 73 41 75 74 68 4c 6f   host/FormsAuthLo
67 54 65 73 74 2f 57 65-62 46 6f 72 6d 31 2e 61   gTest/WebForm1.a
73 70 78 20 48 54 54 50-2f 31 2e 31 0d 0a 41 63   spx HTTP/1.1..Ac
63 65 70 74 3a 20 69 6d-61 67 65 2f 67 69 66 2c   cept: image/gif,
…Other headers of the GET request…
63 68 65 0d 0a 43 6f 6f-6b 69 65 3a 20 2e 41 53   che..Cookie: .AS
50 58 41 55 54 48 3d 33-43 45 46 39 42 39 41 30   PXAUTH=3CEF9B9A0
43 33 37 41 44 46 36 33-45 36 42 44 33 37 42 36   C37ADF63E6BD37B6
39 43 44 41 32 35 30 30-30 46 38 30 37 32 38 46   9CDA25000F80728F
35 31 43 39 35 36 36 44-31 34 43 35 34 31 34 35   51C9566D14C54145
38 31 43 39 33 45 32 41-30 31 44 44 43 44 45 46   81C93E2A01DDCDEF
32 34 41 31 37 34 32 39-34 31 30 43 30 39 37 34   24A17429410C0974
42 33 45 43 42 30 36 34-32 32 38 45 33 35 33 39   B3ECB064228E3539
39 41 38 32 32 42 33 42-39 33 36 44 46 30 38 46   9A822B3B936DF08F
42 41 42 44 33 45 31 30-32 44 30 30 32 31 30 43   BABD3E102D00210C
32 45 31 33 39 38 30 37-39 42 32 33 35 32 39 46   2E1398079B23529F
34 46 35 44 37 34 41 3b-20 50 72 6f 66 69 6c 65   4F5D74A; Profile
3d 56 69 73 69 74 6f 72-49 64 3d 62 32 34 65 62   =VisitorId=b24eb

서버 쪽 요청

서버에 도달한 요청을 살펴보면 서버가 클라이언트가 보낸 것과 동일한 정보를 수신했는지 확인합니다. 서버가 동일한 정보를 받지 못한 경우 네트워크의 다른 디바이스를 조사하여 쿠키가 제거된 위치를 확인해야 합니다.

참고 쿠키를 제거하는 ISAPI 필터의 인스턴스도 있습니다. 웹 서버가 쿠키를 받았지만 쿠키가 IIS 로그에 나열되지 않은 경우 ISAPI 필터를 검사. 문제가 해결되었는지 확인하기 위해 필터를 제거해야 할 수 있습니다.

양식 인증 티켓 시간 초과

사용자가 리디렉션되는 다른 일반적인 원인은 양식 인증 티켓이 만료된 경우입니다. 양식 인증 티켓은 두 가지 방법으로 시간 초과할 수 있습니다. 첫 번째 시나리오는 절대 만료를 사용하는 경우에 발생합니다. 절대 만료 시 만료 시간이 만료되면 인증 티켓이 만료됩니다. 예를 들어 만료 시간을 20분으로 설정하고 사용자가 오후 2시에 사이트를 방문합니다. 사용자가 오후 2시 20분 이후에 사이트를 방문하는 경우 로그인 페이지로 리디렉션됩니다.

슬라이딩 만료를 사용하는 경우 시나리오가 좀 더 복잡합니다. 만료 시간이 반으로 만료된 후 사용자가 사이트를 방문하는 경우 쿠키 및 결과 티켓이 업데이트됩니다. 예를 들어 슬라이딩 만료를 사용하여 20분의 만료를 설정합니다. 사용자는 오후 2시에 사이트를 방문하고 사용자는 오후 2시 20분에 만료되도록 설정된 쿠키를 받습니다. 만료는 사용자가 오후 2시 10분 이후에 사이트를 방문하는 경우에만 업데이트됩니다. 사용자가 오후 2시 09분에 사이트를 방문하는 경우 만료 시간의 절반이 지났기 때문에 티켓이 업데이트되지 않습니다. 사용자가 12분 동안 기다린 후 오후 2시 21분에 사이트를 방문하면 티켓이 만료됩니다. 사용자가 로그인 페이지로 리디렉션됩니다.

이러한 유형의 문제에 접근하는 한 가지 방법은 양식 인증 쿠키 및 티켓 정보를 기록하는 것입니다. 이렇게 하면 IIS에서 쿠키를 받았는지와 값이 무엇인지 확인할 수 있습니다. HttpModule을 작성한 다음, 해당 모듈을 요청 파이프라인에 연결하여 이 작업을 수행할 수 있습니다. 필요한 정보를 얻기 위해 애플리케이션의 코드를 수정할 필요가 없습니다.

연결된 샘플은 Microsoft .NET Framework 1.1 및 .NET Framework 2.0에서 작동하며 전체 주석이 있습니다. 샘플에는 다음 파일이 포함됩니다.

  • FormsAuthEvents.cs: IHttpModule을 구현하고 Application_BeginRequest 이벤트에 연결하는 클래스입니다.

  • FormsAuthInfo.cs: 쿠키를 검색하고 양식 인증 티켓의 암호를 해독하는 클래스입니다. 또한 애플리케이션의 Web.config 파일을 확인하여 양식 인증이 사용하도록 설정되어 있는지 확인합니다.

  • FormsAuthConfig.cs: FormsAuthLogger.config 파일에서 정보를 읽는 클래스입니다.

  • Log.cs: stringbuilder를 수락하고 로그 파일에 값을 쓰는 파일입니다.

  • FormsAuthLogger.config: Log.cs 파일에서 읽는 XML 파일입니다. 이 파일은 빌드된 DLL이 있는 /bin 폴더에 있어야 합니다. 파일을 사용하면 다음을 구성할 수 있습니다.

    • IP로 필터링: 클라이언트 IP로 데이터 캡처를 필터링할 수 있습니다. 이렇게 하면 문제를 재현하는 것으로 알려진 클라이언트의 요청만 기록할 수 있습니다. 이렇게 하면 로그의 크기가 줄어듭니다.

    • 캡처 형식: 파일을 저장할 위치를 지정합니다. 기본값은 임시 ASP.NET Files 폴더이지만 작업자 프로세스 계정에 폴더에 쓸 수 있는 기능이 있는 한 어디서나 저장할 수 있습니다.

참고 FormsAuthLogger.zip 파일에 제공된 코드에 대한 다운로드 링크를 제공합니다.

여기서는 기본 영역을 살펴보겠습니다.

  1. IHttpModule 인터페이스를 구현하는 클래스를 만듭니다.

    public class FormsAuthEvents : IHttpModule 
    {
    …code…
    }
  2. 보려는 이벤트를 연결합니다. 이 샘플에서는 Application_BeginRequest 이벤트를 사용합니다. 이렇게 하면 각 요청을 조사하고 양식 인증 쿠키가 있는지 확인하고 쿠키가 있는 경우 FormsAuthenticationTicket를 기록할 수 있습니다.

    public void Init(HttpApplication application) 
    {
    //Wire up the BeginRequest event
    application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
    }
  3. Application_BeginRequest 이벤트를 구현합니다.

    private void Application_BeginRequest(Object source, EventArgs e)
    {
       …code to log the ticket…
    }
    
  4. 양식 인증 쿠키를 검색한 다음 암호를 해독합니다.

  5. 값을 기록합니다. 양식 정보 외에도 다음을 로깅하는 것이 좋습니다. 필요한 경우 양식 인증 정보를 IIS 로그에 정렬하는 데 도움이 됩니다.

    • 날짜: 요청이 들어왔을 때를 볼 수 있습니다.

    • RequestType: 요청이 Get 또는 Post인지 여부를 표시합니다.

    • URL: 문제로 이어지는 요청 패턴을 보여 줍니다.

    • 추천

    • ClientIP: 요청의 관계를 특정 클라이언트에 연결합니다.

도움이 더 필요하세요?

더 많은 옵션을 원하세요?

구독 혜택을 살펴보고, 교육 과정을 찾아보고, 디바이스를 보호하는 방법 등을 알아봅니다.

커뮤니티를 통해 질문하고 답변하고, 피드백을 제공하고, 풍부한 지식을 갖춘 전문가의 의견을 들을 수 있습니다.

이 정보가 유용한가요?

언어 품질에 얼마나 만족하시나요?
사용 경험에 어떠한 영향을 주었나요?
제출을 누르면 피드백이 Microsoft 제품과 서비스를 개선하는 데 사용됩니다. IT 관리자는 이 데이터를 수집할 수 있습니다. 개인정보처리방침

의견 주셔서 감사합니다!

×