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

StackOverflow https://stackoverflow.com/questions/4627797

Вопрос

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

Я выдавающую пользователей, используя WindowsIdentity Конструктор, как объяснено здесь http://msdn.microsoft.com/en-us/library/ms998351.aspx#paght000023_impersonatingbyusingwindowsientity. Отказ Я проверил, и пользователь правильно осенсирован (я проверил 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]
Это было полезно?

Решение

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

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

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

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

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

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

плюс

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

Параметр Доверенность к доверенности Упражнение учетной записи пользователя (UAC) выполняется в PowerShell с помощью Active Directory Cmdlet здесь.

Вы можете прочитать больше о Аутентификация Windows в ASP.NET 2.0.

Конечно, Alfresco должно включить вход в систему Kerberos.

Другие советы

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

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

request.Credentials = New NetworkCredential («Гость», «Гость»);

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

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

Удачи. Пако

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top