Mon site tourne sur un serveur avec authentification integré de windows (pas d’acces anonyme).
1 )Mon site doit se connecter à un autre site web :
je m’identifie actuellement comme ceci
private System.Net.NetworkCredential iMonCredential;
this.iMonCredential = new NetworkCredential(this.iIDUser, this.iIDPassword, this.iIDDomain);
en passant les 3 parametres (un compte banalisé)
Je peux recuperer l’ID et le Domain de l’utilisateur connecté mais pas sont mot de passe ! (normal)
Y a t’il un moyen d’authentifier
this.iMonCredential
avec l’utilisateur connecté ?
Mon site doit copier un fichier sur le reseau
filecopy(origine,Destination)
sachant que le compte d’execution est ASP.NET comment copier ce fichier en m’identifiant differement (je ne veux pas habiliter le compte ASP.NET sur le repertoire).
…bein non…ca doit etre tout…merci
PS : Non, non, t’as raison bishop, j’ai pris une mauvaise habitude (le forum WEBDEV c’est nouveau pour moi et j’ai du mal à m’y faire)
(sans rapport, et navré de faire mon chieur, mais y c’est le troisième post ASP.NET dans Seg Fault sur les cinq premiers messages. Pour tout ce qui touche au web, je rappele gentiment qu’il a le forum web dev. Merci de poster dans le bon forum).
[quote]C’est du C, du C++, du C#, du Java, du cobol, du fortran -> Seg Fault ok.
Donc on recapitule. C’est pas de la programmation -> pas ici. C’est du web, couche de presentation -> Webdev (flash, html, css, etc). Si c’est du php et que c’est un probleme d’algo, ok. Si c’est du php et un probleme d’html -> Webdev.[/quote]
La remarque sur php s’applique aussi a ASP.Net. Vu que c’est ici un probleme de backend et pas un pb de couche de presentation je pense que ca a tout a fait sa place ici personellement.
j’utilise le compte de l’utilisateur et ca à l’air de correspondre parfaitement à mes besoins
sinon, pour la question N°1, je suis toujour preneur : comment recupérer le user et le mot de passe (crytpé of course) pour initialiser un acces sur un autre serveur ?
Et en activant l’impersonnalisation sur ton second site ca ne fonctionne pas ?
Tu peux accèder aux info de ton utilisateur via System.Threading.Thread.CurrentPrincipal mais ca ne t’aidera pas car tu n’as pas les informations pour créer un Credential correct.
-Sois je fais un formulaire pour le login (ce qui est un peu lours puisque l’appli est censé masquer tous les appels qui sont fait au differents serveurs)
-Sois on definie un compte pour cet appel (solution retenu pour l’instant en attendant que le 2eme site passe en authentification aprouvé)
Quand je fais une copie de fichier dans ce style :
Byte[] lbyte = System.IO.File.ReadAllBytes("\\Serveur1\donnees\A.DOC");
System.IO.File.WriteAllBytes("\\Serveur2\donnees\A_NEW.DOC", lbyte);
En execution local (avec mon user)… Ca marche
quand je deploie sur mon serveur de test(qui a la meme config) et que j’execute de mon poste : ca plante (il m’ouvre une fenetre et me demande de m’identifier)
1 ) sachant que ‘en theorie’, c’est le meme compte (le mien) qui opere dans les 2 cas, Une idée du pourquoi du comment ? la classe system.io.file s’execute t elle sous un autre compte ?
S’il te demande tes credentials, c’est pas un problème sur ton code, c’est un problème de conf IIS : sur ton serveur, t’as bien désactivé l’accès anonyme et activé l’identification intégrée/digest ?
Si ensuite tu prends des exceptions ASP.NET, tu dois avoir les identités qui remontent dans ton eventlog, où tu dois avoir un warning ASP.NET. Ca te permettra de savoir avec quel identité tournait le thread qui a levé l’exception.
Ton problème pour ta première question a du être résolu si tu as activé l’impersonate : ton thread tournera désormais avec l’identité du mec connecté, donc tes requêtes vers ton autre site se feront aussi avec cette identitié.
Au niveau du serveur IIS? J’ai bien désactivé l’acces anonyme et j’ai activé l’identification intégré.
Au niveau du journal des événements de mon serveur IIS, j’ai ca
Le user connecté est bien
MonDomaine\MonCompte
mais le thread s’execute avec le compte MAMACHINE \ASPNET…
Je suis sous 2000 et je suis en trains de me coltiner tous les sites sur le sujet…
Essaye ca :
System.Security.Principal.WindowsIdentity id = System.Threading.Thread.CurrentPrincipal.Identity as System.Security.Principal.WindowsIdentity;
if (id != null)
{
try
{
System.Security.Principal.WindowsIdentity.Impersonate(id.Token);
…
}
catch (Exception ex)
{
}
}
else
{
throw new SecurityException(“Windows authentication not activated”);
}
System.Security.Principal.WindowsIdentity id = System.Threading.Thread.CurrentPrincipal.Identity as System.Security.Principal.WindowsIdentity;
if (id != null)
{
try
{
System.Security.Principal.WindowsIdentity.Impersonate(id.Token);
et jusqu’ici, ID contient mon utilisateur client, mais quand, à la ligne d’apres, j’accede au fichier reseau en lecture …ca plante.
J’ai l’impression qu’une délégation d’identité ce fait pour l’acces au fichier sur le reseau( c’est en gros ce que j’ai pu comprendre dans mes differentes recherches sur IE)…
Si ca ne marche pas, il y a une dernière solution : l’interop Win32.
En gros tu vas utilisé les api Win32 pour te “logger” en temps que l’utilisateur courrant.
Voilà un petit exemple : http://west-wind.com/weblog/posts/1572.aspx
A priori, plutot que d’utiliser le handle renvoyé par LogonUser, tu dois pouvoir utiliser celui de la WindowsIdentity du thread courrant.
Il me semblait que WindowsIdentity.Impersonate faisait celà, mais visiblement ce n’est pas le cas (après petit passage sous Reflector).
Merci girafologue, je vais tenter ton truc demain, mais j’ai l’impression que ca ne va pas suffire.
Car, pour essai, si je change dans le machine.config
Pour que le compte d’execution soit un compte avec droit d’acces sur mon repertoire,
j’ai encore une demande de conexion qui est faite. et dans le journal d’application, j’ai bien :
Request information:
Request URL: http://MONREPERTOIRE/MONREPERTOIRE/DossierBO2.aspx
Request path: /MONREPERTOIRE/DossierBO2.aspx
User host address: xx.xx.x.xxx
User: MonDomaine\MonCompte
Is authenticated: True
Authentication Type: NTLM
Thread account name: MonDomaine\MonCompte<====Preuve que le parametre est bien pris en compte
Il me semble que c’est NTLM qui n’arrive pas à récuperer le compte…Donc modifier le thread d’execution dynamiquement, me parait vain…
Et , en tapant cette reponse,comme je viens de m’apercevoir que le serveur (as400) auquel je tente d’acceder a un protocole ftp…Je vais passer par la (ce qui, à la reflexion avec moi meme, me parait mieux).
Mais, si vous avez d’autres idées pour les générations futures…
Encore merci
Il s’agit d’un webservice avec impersonate=“true” que j’appelle, et qui accède à un autre site (target) qui n’autorise que mon compte windows à accéder aux ressources.
Si je vire “request.Credentials…”, j’obtiens la même erreur que toi.
Ou pas… Je me suis troué en testant. J’ai appellé le webservice directement depuis mon navigateur et ça a fonctionné… En appelant depuis un proxy client webservice je reprends le tir… Je cherche. (Et si ! C’est bon en mettant aussi DefaultCredentials dans le proxy client)