Как получить входной билет Alfresco без пароля пользователя, но с имитированием пользователя с именем участника-пользователя (UPN) - PullRequest
3 голосов
/ 07 января 2011

Я пишу DLL, которая имеет функцию для получения входного билета Alfresco без использования пароля пользователя, используя только имя участника-пользователя (UPN).Я звоню в службу поддержки REST API / 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]

Ответы [ 2 ]

4 голосов
/ 20 января 2011

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

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

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

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

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

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

плюс

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

Настройка TrustedToAuthForDelegation Контроль учетных записей пользователей (UAC) выполняется в PowerShell с помощью командлета Active Directory, объясненного здесь .

Подробнее о Аутентификация Windows в ASP.NET 2.0 .

можно прочитать

Конечно, Alfresco должен иметь включенный логин Kerberos.

1 голос
/ 12 января 2011

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

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

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

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

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

Удачи. Paco

...