2010-06-08 1 views
1

다음은 잠시 머물러있는 간단한 질문입니다.asp.net 명의 도용 신원 : 어디에서 왔습니까?

내 web.config에 asp.net이 로그온 한 사용자 (또는 Windows 인증을 사용하지 않는 경우 익명 계정)를 가장하도록 asp.net이 가장하는 ID는 어디서 오는가?

이 문서는 :

  • Httpcontext.Current.user
  • System.Threading.Thread.Current
  • System.Security.Principal.WindowsIdentity.GetCurrent
  • 이 위치의 아무도 일관되게 일치하지 보인다 : http://msdn.microsoft.com/en-us/library/ff649264.aspx는 로그온 한 사용자에 대한 정보를 검색 할 수있는 세 가지 장소를 보여줍니다 web.config에서 < identity impersonate=true >을 설정할 때 가장 해지는 ID.

    가장 된 ID가 어디서 왔는지 알고 싶습니다.

    특히은 낮은 수준에서 런타임시 정확하게 ID를 가져 오는 것을 묻는 것을 의미합니다. IIS의 구성에 익숙하지만 런타임에 ID가 검색되는 방식과 출처를 알고 싶습니다. 토론을 위해 identity가 web.config 파일이 아니라 IIS에 설정되어 있다고 가정 해 봅니다.

    답변

    4

    가장 부분과 인증 부분을 분리 할 수 ​​없습니다. 난 당신이

    쓰기 때문에 ... asp.net가 자동으로 로그온 한 사용자 가장하는 것을 알고 있다고 생각하는 (또는 익명 계정 Windows 인증을 사용하지 않는 경우) ...

    그러나 나는 혼란 스러워요 문장으로

    설명을 위해, 아이디가 web.config 파일이 아니라 IIS에 설정되어 있다고 가정 해 봅니다.

    정확히 무엇을 의미합니까?

    하지만 나를 어쨌든 답변의 기회를 보자 :
    이의 당신의 Web.config에 IntegratedWindowsSecurity, <identity impersonate=true><authentication mode=Forms>를 사용하는 가정 해 봅시다. 이것은 당신이 인용 한 Building Secure ASP.NET Applications: Authentication, Authorization, and Secure Communication에있는 마지막 테이블의 두 번째 마지막 행에 해당합니다.

    Domain\UserName은이 경우 WindowsIdentity에서 반환됩니다. 그리고 나는 당신이 그 곳에서 궁금해하고 있다고 가정합니다 : Domain\UserName -Identity from ... "Internet"이 URL을 "인트라넷"또는 "로컬"로 분류해야하는 것처럼 Kerberos 사용에 대한 몇 가지 제한이 있습니다. 그러나 이것은 중요하지 않다고 생각합니다.

    이제는 Web.config에서 <authentication mode=windows>을 설정하고 IIS에서 액세스 모드를 IntegratedWindowsSecurity (또는 호출되는 모든 항목)으로 구분하는 것이 중요합니다. 앞서 언급 한 링크의 마지막 테이블에서 우리는 IIS가 IntegratedWindowsSecurity로 설정되는 상황에 처해 있습니다 (그럼에도 불구하고 Web.config에서 <authentication mode="windows">을 설정할 수 있습니다!). 그래서 IE는 현재 사용자 인 을 인증하는 방법에 대해 IIS와 협상합니다. NTLM 또는 Kerberos를 사용합니다 (주로 Windows 버전에 따라 다름). 그것이 Domain\UserName의 출처입니다.

    Windows 통합 인증 Internet Explorer가 액세스 보호 자원을 시도 할 때

    이 은 IIS가 전송

    :

    다음 기사는 (내가 아는 위임에 대해 이야기) 문제 ASP.NET Delegation에 더 많은 빛을 흘릴 수 두 개의 WWW-Authenticate 헤더가 브라우저, Negotiate 및 NTLM에 있습니다. 헤더 협상은 Windows 2000 이상에서 실행되는 IIS 에 의해서만 전송됩니다. 이 헤더는 IIS가 협상 프로토콜을 지원함을 나타내며 인터넷과 탐색기와 IIS간에 협상이 발생하여 Kerberos 또는 NTLM 인증을 사용할 수 있습니다. 클라이언트 (인터넷 익스플로러 5.0 이상) 및 서버 모두가 (나중에 5.0 및 IIS) 경우 IIS 는 윈도우 2000 이상을 실행하는 Kerberos를 사용하며, 모두 동일한 도메인의 구성원 또는 도메인을 신뢰할. 그렇지 않은 경우 서버 의 기본값은 NTLM입니다. NTLM는 IIS에 사용자의 인증 정보를 제공 없이 IIS 대한 사용자를 인증하기 때문에

    , IIS 수없는 대표하는 원격 시스템 사용자의 자격 증명.

    커버 로스 V5 인증과 함께 사용

    , IIS는 신뢰와 위임을 위해 구성되어 나중에 Windows 2000을 실행하는 컴퓨터 또는 사이 보안 자격 증명을 위임 할 수 있습니다.

    당신은 아마 이러한 링크를 알고 있지만 어쨌든 그들을 게시 오전 :

    편집 :
    좀 더 정확한 내 생각 할 수 (확실하지 않음) IIS cre WindowsIdentityLogonToken (here in msdn으로 설명 된 생성자를 사용하여 관리되지 않는 Win32 LogonUser 함수를 호출하여 얻은 것)에서 가져옵니다. 또한 WindowsIdentity Class 설명서의 예제 코드는 매우 흥미 롭습니다 (예 : IntPtrStringTypeConstructor). 로그온 토큰은 Internet Explorer에서 가져와야합니다.

    Scott Hanselman도 비슷한 것을 썼습니다 : System.Threading.Thread.CurrentPrincipal vs. System.Web.HttpContext.Current.User or why FormsAuthentication can be subtle.

    그리고 ASP.NET 사용자 지정 주체 개체를 ASP.NET 인증 프로세스에 "임플란트"하는 솔루션을 찾는 경우 추가 정보를 추출 할 수 있다고 생각합니다 (일반적으로 : Global.asax). 예를 들어 Using Custom Principal with Forms Authentication in ASP.NET과 같습니다.

    아니면 Reflector를 사용하고 직접 볼 :) 수

    +0

    인증과 가장은 분리 할 수 ​​있지만 ASP.NET 구성을 사용하는 대신 직접 수행해야합니다. 다양한 예를 보려면이 기사를 참조하십시오. http://support.microsoft.com/kb/306158. – umbyersw

    -1

    내가 잘못하지 않았다면 이것은 IIS에 설정된 ID입니다. 디렉토리 보안.

    +0

    하지 내가 찾고 답 -이 답변 구성의 ID를 설정하는 방법을 설정합니다. 나는 그것이 런타임에 어디에서 검색되는지 알고 싶다. –

    +0

    환경을 사용해보십시오. 사용자 이름 – aepheus

    -1

    나는 이전에 을 가장 한 ID를의 web.config 파일에 설정했습니다. 이 경우 사용자를 만들고 해당 사용자 아래에 응용 프로그램 풀을 설정하고 해당 사용자 이름을 가장으로 사용했습니다.

    +0

    아직 답을 찾지 못했습니다. 나는 가장을 구성하는 방법에 대해 묻지 않았습니다. 나는 그것을하는 방법을 안다. 런타임에 가장 된 ID가 어디에서 왔는지 묻는 중입니다. –

    7

    가장 (impersonation)을 사용하면 IIS에서 ID를 가져옵니다. ASP.NET은 IIS가 제공하는 액세스 토큰을 가장합니다.

    시작할 프로세스를 실행하는 데 사용 된 원래 액세스 토큰을 계속 사용할 수 있습니다. 이것은 질문에 언급 된 세 가지 API를 사용하는 데 따른 혼란의 원인 일 수 있습니다.

    Thread.CurrentPrincipal & HttpContext.Current.User : 줄의 반대편에있는 사용자의 신원.

    • 는 토큰 가장 통해 ASP.NET에 전달 된 정보입니다
    • 이 토큰에 동적으로 생성을 기반으로 신원이된다 :
    • 중 하나가) 사용자가 Windows 인증 대 (양식에 기록하는 방법),
    • 또는 : b) web.config에서 가장 사용자 이름 설정이 무엇인지.

    WindowsIdentity.GetCurrent : 실행중인 실제 Windows 계정입니다.

    • ASP.NET이 가장을 시작하기 전에 프로세스가 시작된 방법입니다.
    • 이것은 WindowsIdentity 일뿐입니다.

    HttpContext.Current.User에서 중복되는 이유는 ASP.NET 개발자가 편리하기 때문입니다.

    편집 : IIS는 Windows 통합 인증에서 실행되도록 구성되어

    , 및 ASP.NET이 가장 활성화 한, 다음 코드는 기본 계정으로 코드를 실행 할 수있게됩니다. 당신이 당신의 응용 프로그램, 우선에에 효과를 갖는 어떤 개체에 대한 우려가있는 경우 http://support.microsoft.com/kb/306158

    +0

    프로세스를 실행하는 데 사용 된 원래 액세스 토큰이 가장 (impersonation)으로 사용되었다고 말하면 ... IIS 프로세스라고 가정합니다. 그러나 어떻게하면 Windows 인증을 사용하도록 IIS를 구성하면 IIS가 로그온 한 사용자의 토큰으로 가장 할 수 있는지 확신 할 수 없습니다. –

    +1

    이 문서를 보면 http://msdn.microsoft.com/en-us/library/ff649264.aspx에서 MS에 따르면 'WindowsIdentity.GetCurrent'가 세 가지 API 중 유일한 것임을 알 수 있습니다 명의 도용시 변경되는 사용자 이름 –

    +0

    명확히하기 위해 내가 말한 것은 "시작하기 위해 프로세스를 실행하는 데 사용 된 원래 액세스 토큰은 계속 사용할 수 있습니다." 네, 이제 두 개의 Windows ID가 있습니다 ... 내 대답을 편집하여 기본 Windows 계정으로 다시 전환하는 방법에 대한 샘플 코드를 포함시킵니다. – umbyersw

    0

    : 당신이 뭘 하려는지에 따라

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    public static extern bool RevertToSelf(); 
    
    protected void Page_Load(object sender, EventArgs e) 
    { 
        var me = WindowsIdentity.GetCurrent(); 
    
        // At this point: 
        // me.Name = Domain\UserName 
        // me.AuthenticationType = Kerberos 
    
        if (RevertToSelf()) 
        { 
         var underMe = WindowsIdentity.GetCurrent(); 
         // At this point: 
         // underMe.Name = IIS APPPOOL\DefaultAppPool 
         // underMe.AuthenticationType = Negotiate 
        } 
    } 
    

    이 페이지는 문제를 공격의 더 많은 방법이있다 (Windows, Form, Passport 또는 None)과 같은 인증 모드가 표시됩니다.

    요청을 자동 서명하기 위해 읽은 자격 증명은 응용 프로그램에서 선택한 인증 모드에 따라 달라집니다.