Как получить билет входит в систему на Alfresco без пароля пользователя, но с выдающимся пользователем с именем пользователя пользователя (UPN)
-
08-10-2019 - |
Вопрос
Я пишу 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]
Решение
Я решил проблему!
Я верю, что у нас было Двойная проблема.
Это то, что нужно было сделать, чтобы решить эту проблему:
- Пользователь, который запускает мой DLL, должен быть Windows Server 2003 Домен пользователя
- Служба, использующая мою DLL, должно быть зарегистрировано Обладающее имя сервиса В контроллере домена с пользователем, который запускает его (пользователь, который запускает мою DLL)
- Пользователь, который запускает мою DLL, не должен иметьУчетная запись чувствительна и не может быть делегирована Опция выбрана в контроллере домена
- Пользователь, который запускает мой DLL, должен иметьДоверьтесь этим пользователю для делегации на любой сервис (только Kerberos) или Доверяйте этому пользователю для делегации только к указанным услугам Опция, выбранная в контроллере домена (если пользователь находится в Windows Server 2003 Functional Domain, эта опция доступна только при регистрации обслуживания главного имени с этим пользователем)
- Пользователь, который запускает мой DLL, должен иметь Доверенность к доверенности Управляйте учетной записью пользователя (UAC), установленные на true
- Компьютер, который запускает службу, которая использует мою 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 или что вы предлагаете.
Удачи. Пако