Come arrivare biglietto login Alfresco senza password utente, ma con impersonando utente con nome principale utente (UPN)

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

Domanda

Sto scrivendo una DLL che ha funzione per ottenere biglietto login Alfresco senza l'utilizzo di password utente, utilizzando solo un nome principale utente (UPN). Sto chiamando all'aperto servizio REST API / wcservice . Io uso NTLM in Alfresco.

sto impersonando gli utenti che utilizzano costruttore WindowsIdentity come spiegato qui http: / /msdn.microsoft.com/en-us/library/ms998351.aspx#paght000023_impersonatingbyusingwindowsidentity . Ho controllato e l'utente è correttamente impersonando (ho controllato proprietà WindowsIdentity.GetCurrent().Name).

Dopo rappresentazione di un utente, cerco di fare HttpWebRequest e impostare le sue credenziali con CredentialsCache.DefaultNetworkCredentials. Ottengo l'errore:

The remote server returned an error: (401) Unauthorized.
   at System.Net.HttpWebRequest.GetResponse()

Quando uso new NetworkCredential("username", "P@ssw0rd") alle credenziali di richiesta insieme, ho capito biglietto login Alfresco (HttpStatusCode.OK, 200).

C'è un modo che io possa ottenere biglietto login Alfresco senza password utente?

Ecco il codice che sto usando:

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);
 }
}

Qui ci sono record da Alfresco stdout.log (se aiuta in alcun modo):

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]
È stato utile?

Soluzione

Ho risolto il problema!

Credo che abbiamo avuto un doppio hop problema .

Questo è ciò che doveva essere fatto per risolvere questo problema:

  1. utente che esegue il mio DLL deve essere dominio di Windows Server 2003 utente
  2. servizio che utilizza il mio DLL deve avere registrati nome principale di servizio in Il controller di dominio con l'utente che lo gestisce (utente che esegue il mio DLL)
  3. utente che esegue il mio DLL non deve avere account è sensibile e non può essere delegato opzione selezionata nei servizi di Domini Controller
  4. utente che esegue il mio DLL deve avere Utente attendibile per la delega a qualsiasi servizio (solo Kerberos) o Fiducia l'utente per la delega a servizi specificati selezionato nel regolatore di dominio (se l'utente è in Windows Server 2003 dominio funzionale questa opzione è disponibile solo al momento della registrazione Nome principale di servizio con questo utente)
  5. utente che esegue il mio DLL deve avere TrustedToAuthForDelegation Controllo account utente (UAC) impostato a true
  6. Computer che il servizio piste che utilizzi il mio DLL deve avere Trust Computer per delega a qualsiasi servizio (Kerberos solo) o Trust Computer per delega ai servizi specificati solo opzione selezionata nei servizi di Domini Controllore

Tutto questo (e molto altro) è spiegato nel documento Microsoft Risoluzione dei problemi delega Kerberos . Esso contiene:

  • Lista di controllo per Active Directory,
  • Lista di controllo per l'applicazione client,
  • Lista di controllo per middle-tier,
  • Lista di controllo per back-end

più

  • esempi di configurazione per comune scenari.

Impostazione TrustedToAuthForDelegation Controllo account utente (UAC) è fatto in PowerShell cmdlet Active Directory spiegato qui .

Si può leggere di più su autenticazione di Windows in ASP.NET 2.0 .

Naturalmente, Alfresco deve avere Kerberos abilitato login.

Altri suggerimenti

penso che non è possibile per Alfresco. Solo se si utilizza sottosistema speciale di autenticazione in cui esiste questo utente 'impersonale'.

Prova questo, perché l'utente 'guest' è trasversale a tutti l'autenticazione sottosistema.

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

E l'URI, qualcosa di simile:

stringa URI = "http: //. Alfrescoserver / all'aperto / s / api / login o qualsiasi altra cosa vi proponete

In bocca al lupo. Paco

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top