3 votes

Comment obtenir le ticket de connexion Alfresco sans le mot de passe de l'utilisateur, mais en usurpant l'identité de l'utilisateur avec son nom principal (UPN) ?

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]

4voto

dok Points 247

J'ai résolu le problème !

Je crois que nous avons eu problème du double saut .

C'est ce qu'il fallait faire pour résoudre ce problème :

  1. L'utilisateur qui exécute ma DLL doit être Domaine Windows Server 2003 utilisateur
  2. Le service qui utilise ma DLL doit avoir enregistré Nom du responsable du service dans Contrôleur de domaine avec un utilisateur qui l'exécute (l'utilisateur qui exécute ma DLL).
  3. L'utilisateur qui exécute ma DLL ne doit pas avoir Le compte est sensible et ne peut être délégué option sélectionnée dans Domaine contrôleur
  4. L'utilisateur qui exécute ma DLL doit avoir Confier à cet utilisateur la délégation à tout service (Kerberos uniquement) o Confiance à cet utilisateur pour la délégation à services spécifiés uniquement option sélectionnée dans le contrôleur de domaine (si l'utilisateur est sous Windows Server 2003 domaine fonctionnel, cette option est disponible uniquement lorsque vous enregistrez Service Principal Name avec cet utilisateur)
  5. L'utilisateur qui exécute ma DLL doit avoir TrustedToAuthForDelegation le contrôle de compte d'utilisateur (UAC) défini sur vrai
  6. Ordinateur qui exécute un service qui utilise ma DLL doit avoir Ordinateur de confiance pour délégation à tout service (Kerberos uniquement) o Ordinateur de confiance pour délégation à des services spécifiques uniquement sélectionnée dans Domain Controller

Tout cela (et plus encore) est expliqué dans le document de Microsoft Dépannage de la délégation Kerberos . Il contient :

  • liste de contrôle pour Active Directory,
  • liste de contrôle pour l'application client,
  • liste de contrôle pour le niveau intermédiaire,
  • Liste de contrôle pour le back-end

plus

  • exemples de configuration pour des communs.

Réglage de TrustedToAuthForDelegation Le contrôle des comptes d'utilisateurs (UAC) se fait dans PowerShell par la cmdlet Active Directory expliquée aquí .

Vous pouvez en savoir plus sur Authentification Windows en ASP.NET 2.0 .

Bien entendu, Alfresco doit avoir activé le login Kerberos.

1voto

Paco Points 11

Je pense que ce n'est pas possible pour Alfresco. Seulement si vous utilisez un sous-système d'authentification spécial où existe cet utilisateur 'impersonnel'.

Essayez ceci, car l'utilisateur 'guest' est transversal pour l'authentification de tous les sous-systèmes.

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

Et l'URI, quelque chose comme ça :

string URI = "http://alfrescoserver/alfresco/s/api/login ou ce que vous proposez.

Bonne chance. Paco

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X