J'écris une DLL qui a une fonction pour obtenir le ticket de connexion Alfresco sans utiliser le mot de passe de l'utilisateur, en utilisant seulement un nom principal d'utilisateur (UPN). J'appelle le service REST API d'Alfresco. /wcservice . J'utilise NTLM dans Alfresco.
J'usurpe l'identité des utilisateurs en utilisant WindowsIdentity
comme expliqué ici http://msdn.microsoft.com/en-us/library/ms998351.aspx#paght000023_impersonatingbyusingwindowsidentity . J'ai vérifié et l'utilisateur est correctement usurpé d'identité (j'ai vérifié WindowsIdentity.GetCurrent().Name
propriété).
Après avoir usurpé l'identité d'un utilisateur, je tente de faire HttpWebRequest
et définir ses informations d'identification avec CredentialsCache.DefaultNetworkCredentials
. Je reçois l'erreur :
The remote server returned an error: (401) Unauthorized.
at System.Net.HttpWebRequest.GetResponse()
Quand j'utilise new NetworkCredential("username", "P@ssw0rd")
pour définir les informations d'identification de la demande, j'obtiens un ticket de connexion Alfresco ( HttpStatusCode.OK
, 200).
Existe-t-il un moyen d'obtenir le ticket de connexion Alfresco sans le mot de passe de l'utilisateur ?
Voici le code que j'utilise :
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);
}
}
Voici les enregistrements du stdout.log d'Alfresco (si cela peut vous aider) :
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]