Как получить билет для входа в Alfresco без пароля пользователя, но с выдачей себя за пользователя с основным именем пользователя (UPN)

Я пишу DLL, которая имеет функцию для получения билета для входа в Alfresco без использования пароля пользователя, используя только основное имя пользователя (UPN). Я вызываю службу REST API alfresco /wcservice. Я использую NTLM в Alfresco.

Я выдаю себя за пользователей с помощью конструктора WindowsIdentity, как описано здесь http://msdn.microsoft.com/en-us/library/ms998351.aspx#paght000023_impersonatingbyusingwindowsidentity. Я проверил, и пользователь правильно олицетворяется (я проверил свойство WindowsIdentity.GetCurrent().Name).

Выдав себя за пользователя, я пытаюсь создать HttpWebRequest и установить его учетные данные с помощью CredentialsCache.DefaultNetworkCredentials. Я получаю сообщение об ошибке:

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

Когда я использую new NetworkCredential("username", "P@ssw0rd") для установки учетных данных запроса, я получаю входной билет Alfresco (HttpStatusCode.OK, 200).

Есть ли способ получить билет для входа в Alfresco без пароля пользователя?

Вот код, который я использую:

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", "p@ssw0rd"); // 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);
 }
}

Вот записи из Alfresco stdout.log (если это как-то поможет):

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]

person dok    schedule 07.01.2011    source источник


Ответы (2)


Я решил проблему!

Я считаю, что у нас была двойная проблема с прыжком.

Вот что нужно было сделать, чтобы решить эту проблему:

  1. Пользователь, запускающий мою библиотеку DLL, должен быть пользователем домена Windows Server 2003.
  2. Служба, использующая мою DLL, должна зарегистрировать Имя участника службы в контроллере домена с пользователем, который ее запускает (пользователь, который запускает мою DLL)
  3. Пользователь, запускающий мою DLL, не должен иметь параметр Учетная запись конфиденциальна и не может быть делегирована, выбранный в контроллере домена.
  4. У пользователя, запускающего мою DLL, должен быть выбран параметр Доверять этому пользователю для делегирования любой службе (только Kerberos) или Доверять этому пользователю для делегирования только указанным службам в контроллере домена (если пользователь находится в функциональном домене Windows Server 2003, этот параметр доступен только в том случае, если вы регистрируете имя участника-службы для этого пользователя)
  5. У пользователя, запускающего мою библиотеку DLL, должно быть установлено значение true для элемента управления учетными записями пользователей (UAC) TrustedToAuthForDelegation.
  6. На компьютере, на котором запущена служба, использующая мою библиотеку DLL, должен быть выбран параметр Доверять компьютеру для делегирования любой службе (только Kerberos) или Доверять компьютеру для делегирования только указанным службам в контроллере домена.

Все это (и многое другое) объясняется в документе Microsoft Устранение неполадок делегирования Kerberos. Это содержит:

  • контрольный список для Active Directory,
  • контрольный список для клиентского приложения,
  • контрольный список для среднего уровня,
  • контрольный список для Back-end

плюс

  • примеры конфигурации для распространенных сценариев.

Настройка управления учетными записями пользователей (UAC) TrustedToAuthForDelegation выполняется в PowerShell с помощью командлета Active Directory. ="nofollow">здесь.

Вы можете узнать больше об проверке подлинности Windows в ASP.NET 2.0.

Разумеется, в Alfresco должен быть включен вход по протоколу Kerberos.

person dok    schedule 20.01.2011

Я думаю, что это невозможно для Alfresco. Только если вы используете специальную подсистему аутентификации, где существует этот «обезличенный» пользователь.

Попробуйте это, потому что пользователь-гость сквозной для аутентификации всех подсистем.

request.Credentials = new NetworkCredential («гость», «гость»);

И URI, что-то вроде этого:

string URI = "http://alfrescoserver/alfresco/s/api/login или что вы предложите.

Удачи. Пако

person Paco    schedule 12.01.2011
comment
Если я использую alfrescoserver/alfresco/s/api/login, мне нужно указать пароль пользователя как параметр, которого я пытаюсь избежать. Я считаю, что то, что я пытаюсь сделать, должно быть возможным. Все, что мне нужно сделать, это получить правильные учетные данные для HTTP-запроса. Возможно, у меня проблема с двойным переходом (blogs.msdn.com/b/knowledgecast/archive/2007/01/31/), и я читаю документ Microsoft "Устранение неполадок делегирования Kerberos" (microsoft.com/downloads/en/), чтобы попытаться решить эту проблему. Мне все еще нужна помощь. - person dok; 13.01.2011