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)
-
08-10-2019 - |
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]
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