3

사용자 암호를 사용하지 않고 Alfresco 로그인 티켓을 가져 오는 기능을 가진 DLL을 작성하고 있습니다 (사용자 이름 UPN). alfresco REST API 서비스 /wcservice을 호출합니다. 나는 Alfresco에서 NTLM을 사용합니다.사용자 암호없이 Alfresco 로그인 티켓을 얻는 방법 (사용자 본명 (UPN)을 가장한 사용자)

여기에 설명 된대로 WindowsIdentity 생성자를 사용하여 사용자를 가장합니다. http://msdn.microsoft.com/en-us/library/ms998351.aspx#paght000023_impersonatingbyusingwindowsidentity. 내가 확인하고 사용자가 적절하게 가장 한 것입니다 (나는 WindowsIdentity.GetCurrent().Name 속성을 확인했습니다).

사용자를 가장한 후 HttpWebRequest으로 설정하고 자격 증명을 CredentialsCache.DefaultNetworkCredentials으로 설정하려고합니다. 내가 요청 자격 증명을 설정하는 new NetworkCredential("username", "[email protected]")를 사용할 때 나는 프레스코 로그인 티켓 (HttpStatusCode.OK, 200)를 얻을

The remote server returned an error: (401) Unauthorized. 
    at System.Net.HttpWebRequest.GetResponse() 

: 나는 오류가 발생합니다.

사용자 비밀번호없이 Alfresco 로그인 티켓을 얻을 수있는 방법이 있습니까?

17:18:04,550 DEBUG [app.servlet.NTLMAuthenticationFilter] Processing request: /alfresco/wcservice/mg/util/login SID:7453F7BD4FD2E6A61AD40A31A37733A5 
17:18:04,550 DEBUG [web.scripts.DeclarativeRegistry] Web Script index lookup for uri /mg/util/login took 0.526239ms 
17:18:04,550 DEBUG [app.servlet.NTLMAuthenticationFilter] New NTLM auth request from 10.**.**.** (10.**.**.**:1229) 
17:18:04,566 DEBUG [app.servlet.NTLMAuthenticationFilter] Processing request: /alfresco/wcservice/mg/util/login SID:7453F7BD4FD2E6A61AD40A31A37733A5 
17:18:04,566 DEBUG [web.scripts.DeclarativeRegistry] Web Script index lookup for uri /mg/util/login took 0.400909ms 
17:18:04,566 DEBUG [app.servlet.NTLMAuthenticationFilter] Received type1 [Type1:0xe20882b7,Domain:<NotSet>,Wks:<NotSet>] 
17:18:04,566 DEBUG [app.servlet.NTLMAuthenticationFilter] Client domain null 
17:18:04,675 DEBUG [app.servlet.NTLMAuthenticationFilter] Sending NTLM type2 to client - [Type2:0x80000283,Target:AlfrescoServerA,Ch:197e2631cc3f9e0a] 

답변

4

나는 문제를 해결했다!

나는 우리가 double-hop problem을 가지고 있었다고 생각한다.

이이 문제를 해결하기 위해 수행해야했습니다 것입니다 :

  1. 사용자 내 DLL이 있어야합니다 내 DLL을 사용 Windows Server 2003의 도메인 사용자
  2. 서비스해야 실행 등록 서비스 사용자 이름 ( ) 사용자가 인 도메인 컨트롤러 (내 DLL을 실행하는 사용자)
  3. 내 DLL을 실행하는 사용자는 계정이 민감하고 내 DLL을 실행 컨트롤러
  4. 사용자가 모든 서비스 신뢰 임용으로이 사용자가 있어야 도메인에서 선택한 옵션 (Kerberos를 전용) 또는 신뢰 이 위임 될 수 없다하지 사용자가 에 지정된 서비스 만 옵션 을 도메인 컨트롤러에서 선택한 경우 ( 사용자가 Windows Server 2003에있는 경우 기능 도메인) 내 DLL을 실행이 사용자와의 TER 서비스 사용자 이름)
  5. 사용자에 대한 신뢰 컴퓨터가 있어야합니다 내 DLL을 사용하여 서비스를 실행 TrustedToAuthForDelegation 사용자 계정 제어 진정한
  6. 컴퓨터로 설정 (UAC)가 있어야합니다 모든 서비스에 대표 (Kerberos를 만) 도메인 컨트롤러에서 선택한 특정 서비스 만 옵션 위임 또는 는 신뢰 컴퓨터

이 모든 내용은 Microsoft Troubleshooting Kerberos Delegation에 설명되어 있습니다. 그것은 포함 : Active Directory에 대한

  • 체크리스트, 클라이언트 응용 프로그램에 대한
  • 체크리스트, 중간 계층에 대한
  • 체크리스트, 백 엔드에 대한
  • 체크리스트를

플러스

  • 공통 구성 예 시나리오. Active Directory의 cmdlet에서 PowerShell에서 수행 TrustedToAuthForDelegation 사용자 계정 컨트롤 (UAC)를 설정

here을 설명했다.

Windows Authentication in ASP.NET 2.0에 대한 자세한 내용을 볼 수 있습니다.

물론 Alfresco에는 Kerberos 로그인이 활성화되어 있어야합니다.

1

나는 그것이라고 생각 : 프레스코 stdout.log에서

private string GetTicket(string UPN) { 
WindowsIdentity identity = new WindowsIdentity(UPN); 
WindowsImpersonationContext context = null; 

try { 
    context = identity.Impersonate(); 

    MakeWebRequest(); 
} 
catch (Exception e) { 
    return e.Message + Environment.NewLine + e.StackTrace; 
} 
finally { 
    if (context != null) { 
    context.Undo(); 
    } 
} 
} 

private string MakeWebRequest() { 
string URI = "http://alfrescoserver/alfresco/wcservice/mg/util/login"; 


HttpWebRequest request = WebRequest.Create(URI) as HttpWebRequest; 

request.CookieContainer = new CookieContainer(1); 

//request.Credentials = new NetworkCredential("username", "[email protected]"); // It works with this 
request.Credentials = CredentialCache.DefaultNetworkCredentials; // It doesn’t work with this 
//request.Credentials = CredentialCache.DefaultCredentials; // It doesn’t work with this either 

try { 
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { 
    StreamReader sr = new StreamReader(response.GetResponseStream()); 

    return sr.ReadToEnd(); 
    } 
} 
catch (Exception e) { 
    return (e.Message + Environment.NewLine + e.StackTrace); 
} 
} 
다음

있습니다 기록 (그것이 어떤 식 으로든 도움이된다면) : 여기

내가 사용하고 코드입니다 알 프레스코에서는 불가능합니다. 이 '비 개인적인'사용자가 존재하는 특수 인증 서브 시스템을 사용하는 경우에만.

'게스트'사용자가 모든 하위 시스템 인증을 위해 가로 채기 때문에이 방법을 사용해보십시오.

request.Credentials = new NetworkCredential ("guest", "guest");

그리고 URI, 이런 식으로 뭔가 :

문자열 URI = "HTTP :.. // alfrescoserver/야외/S/API/로그인 또는 제안 어떤

행운 파코을

+1

http : // alfrescoserver/alfresco/s/api/login을 사용하는 경우 사용자의 암호를 매개 변수로 제공해야하므로 피하려고합니다. 나는 내가하려는 일이 가능해야한다고 생각한다. 내가해야 할 일은 HTTP 요청에 대한 올바른 자격 증명을 얻는 것입니다. 어쩌면 더블 홉 문제 (http://blogs.msdn.com/b/knowledgecast/archive/2007/01/31/the-double-hop-problem.aspx)가 있으며 Microsoft의 문서 인 Kerberos 문제 해결 위임 (http://www.microsoft.com/downloads/en/details.aspx?familyid=99b0f94f-e28a-4726-bffe-2f64ae2f59a2&displaylang=en) (영문)을 참조하십시오. 아직 도움이 필요합니다. – dok