Comment obtenir un billet de connexion sans mot de passe Alfresco utilisateur, mais avec se faisant passer pour l'utilisateur avec nom d'utilisateur principal (UPN)

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

Question

J'écris une DLL qui a une fonction pour obtenir un billet de connexion sans utiliser Alfresco mot de passe utilisateur, en utilisant uniquement un nom d'utilisateur principal (UPN). J'appelle le service API alfresco REST / wcservice . J'utilise NTLM dans Alfresco.

J'usurper l'identité des utilisateurs en utilisant constructeur WindowsIdentity comme expliqué ici http: / /msdn.microsoft.com/en-us/library/ms998351.aspx#paght000023_impersonatingbyusingwindowsidentity . J'ai vérifié et l'utilisateur est correctement Personnifiés (j'ai vérifié la propriété WindowsIdentity.GetCurrent().Name).

Après un utilisateur se faisant passer, je tente de faire HttpWebRequest et définir ses lettres de noblesse 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 les informations d'identification de demande de jeu, je reçois un billet de connexion Alfresco (de HttpStatusCode.OK, 200).

Est-il possible que je peux obtenir un billet de connexion sans mot de passe Alfresco 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 de Alfresco stdout.log (si elle aide de quelque façon):

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]
Était-ce utile?

La solution

J'ai résolu le problème!

Je crois que nous avions un Dépannage délégation Kerberos . Il contient:

  • Aide-mémoire pour Active Directory,
  • liste de contrôle pour l'application client,
  • liste de contrôle pour niveau moyen,
  • Liste de contrôle pour back-end

plus

    configuration
  • exemples communs scénarios.

Réglage TrustedToAuthForDelegation contrôle de compte utilisateur (UAC) est fait dans PowerShell cmdlet Active Directory a expliqué .

Vous pouvez en savoir plus sur l'authentification Windows dans ASP.NET 2.0 .

Bien sûr, Alfresco doit avoir connexion Kerberos activé.

Autres conseils

Je pense qu'il est impossible pour Alfresco. Seulement si vous utilisez le sous-système d'authentification spécial où existe cet utilisateur « impersonnel ».

Essayez ceci, parce que l'utilisateur « invité » est transversal pour toutes les authentifications du sous-système.

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

Et l'URI, quelque chose comme ceci:

URI chaîne = « http: //. Alfrescoserver / alfresco / s / api / login ou tout ce que vous proposez

Bonne chance. Paco

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top