복붙노트

[SPRING] IE는 NTLM 인증을 사용하는 동안 무작위로 빈 POST 본문을 보냅니다 (각도를 봄으로 사용).

SPRING

IE는 NTLM 인증을 사용하는 동안 무작위로 빈 POST 본문을 보냅니다 (각도를 봄으로 사용).

IE 11에서 POST가 누락 된 것처럼 보이는 무작위 호출 문제가 있습니다. 추가 검사시 브라우저의 요청에 NTLM 협상 토큰이 포함됩니다. 우리는 수시로 GET에서이 토큰을 봅니다. 그러나 몸 문제에 영향을받지 않습니다. 크롬과 FF에는이 문제가 없습니다.

추가 조사에 따르면 세션 시간이 초과되고 브라우저가 다시 등록되면 약 1 ~ 2 분 간격으로이 문제가 계속 발생합니다. IE가 "예상하는"401이라면 NTLM 핸드 셰이크가 다시 발생할 것으로 기대하는대로 POST 본문이 포함되지 않는다는 것을 이해합니다.

각도 앱이 있습니다 (현재 각도 1과 각도 2가 혼합되었지만이 직전에 1에서 발생했습니다). 각도 응용 프로그램을 사용하면 Spring 부팅 응용 프로그램에 안정적인 웹 서비스 호출이 가능합니다. 우리는 NTLM 인증을 위해 와플을 사용하고 있습니다.

// Shiro-Waffle / Security
'com.github.dblock.waffle:waffle-parent:1.7.3',
'com.github.dblock.waffle:waffle-shiro:1.7.3',
'org.apache.shiro:shiro-core:1.2.3',
'org.apache.shiro:shiro-web:1.2.3',

https://blogs.msdn.microsoft.com/ieinternals/2010/11/21/challenge-response-authentication-and-zero-length-posts/

나는 아래에 대답으로 게시 할 하나의 엉터리 해결책을 가지고 있지만, 나는 그것을 전혀 좋아하지 않는다.

해결법

  1. ==============================

    1.좋아, 레지스트리 해킹을 발견했다. 기본적으로 IE는 서버에서 401없이 사전에 NTLM 자격 증명을 보냅니다. "pre auth"를 전송할 때 IE는 POST 본문을 생략합니다 (요청이 POST 인 경우). 세션이 이미 유효하고 서버가 이미 권한을 부여한 경우 본문없이 요청을 처리 할 수 ​​있으며 서버 (본체가 POST에 필요하다고 가정)

    좋아, 레지스트리 해킹을 발견했다. 기본적으로 IE는 서버에서 401없이 사전에 NTLM 자격 증명을 보냅니다. "pre auth"를 전송할 때 IE는 POST 본문을 생략합니다 (요청이 POST 인 경우). 세션이 이미 유효하고 서버가 이미 권한을 부여한 경우 본문없이 요청을 처리 할 수 ​​있으며 서버 (본체가 POST에 필요하다고 가정)

    따라서 일반적인 NTLM 협상은 다음과 같이 보입니다.

    이 최적화

    문제가 발생 함

    레지스트리 항목을 추가하면이 "최적화"

    HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Internet Settings/ 
    Add the following registry value: 
    Value Name: DisableNTLMPreAuth
    Data Type: REG_DWORD
    Value: 1
    

    또는이 항목을 컴퓨터의 .reg 파일에 저장하고 두 번 클릭합니다.

    Windows Registry Editor Version 5.00
    
    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\]
    "DisableNTLMPreauth"=dword:00000001
    

    나는 IE가 재 인증해야하는 이유를 확신하지 못한다. 그러나 일단 IE가 세션 타임 아웃을 갖거나 세션이 무효화되고 서버에서 401을 되 찾으면, 매번 1을 재 인증하려고한다. 그 후 2 분. 이것은 루트에 있지 않을 수도 있기 때문에 인증시에 어떤 URL과 관련이있을 수 있습니다. 필자가 제공 한 첫 번째 링크는 IE의 URL 피킹 (peekiness)과 권한 부여가 무엇인지, 경로 지정을 기반으로해서는 안되는 것이 무엇인지 추측하는 방법에 대해 많이 이야기합니다.

    관련 기사:

    제로 길이의 게시물

    NTLM 사전 인증

    NTLM 사전 인증

    NTLM 사전 인증 jcifs

  2. ==============================

    2.나는 체인 (Groovy)의 마지막 필터로 넣은 시로 필터를 만들었습니다.

    나는 체인 (Groovy)의 마지막 필터로 넣은 시로 필터를 만들었습니다.

    package com.security.shiro
    
    import com.security.AuthenticateTrait
    import com.ws.RemoteUserAccessor
    import com.ws.RequestAccessor
    
    import javax.servlet.ServletRequest
    import javax.servlet.ServletResponse
    
    /**
     * Created by esarrazin on 11/30/2016.
     */
    class IEBugFilter3 extends NegotiateAuthenticationFilter implements RemoteUserAccessor, AuthenticateTrait, RequestAccessor {
    
    /**
     * Returns <code>false</code> If the giant piece of sh1t IE chooses to think that it will need to re-authenticate
     * and not send the body to us.  Here we will deny access (as IE expects - big turd) and have waffle re-negotiate
     * this useless sh1t-bag.  Then and only then will IE choose to give us the body of the POST.  This problem is intermittent
     * and there is no telling when IE will use its infinite wisdom to do this, so please don't think if you comment this
     * out it is still working without.
     *
     * Not a silver bullet, but here is a link to some reading about this:
     * https://blogs.msdn.microsoft.com/ieinternals/2010/11/21/challenge-response-authentication-and-zero-length-posts/
     *
     * @return Returns true if isAccessAllowed
     */
    @Override
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
            !isRequestExpectingToReAuth(request, response)
    }
    
    private boolean isRequestExpectingToReAuth(ServletRequest request, ServletResponse response) {
        if (request?.request?.request?.coyoteRequest?.methodMB == 'POST' && toHttp(request).getHeader('content-length') == '0') {
            System.out.println("Found the dreaded zero length body and attempting to recover from it. $request.remoteHost")
            return true
        }
    
        return false
    }
    

    }

    우리의 NegotiateAuthenticationFilter는 waffle.shiro.negotiate.NegotiateAuthenticationFilter를 확장하며 매우 간단합니다.

    이것은 비어있는 본문 POST 요청을 보았습니다 (요청을 용서하십시오. 쓰레기를 요청하십시오 - 준비가 안됨). 그러면 액세스가 거부되므로 IE는 예상 한 것을 제공합니다. 우리가 액세스를 거부하기 때문에 401이 건너 가서 핸드 셰이크가 시작됩니다. 그런 다음 200이 제시되면 IE는 신체를 방출하고 우리는 AOK입니다. 그러나 이는 솔루션이라 할 수 있습니다.

  3. from https://stackoverflow.com/questions/40918017/ie-sends-empty-post-body-randomly-while-using-ntlm-authentication-using-angular by cc-by-sa and MIT license