2009-10-05 5 views
1

J'ai une application ASP.NET utilisant l'authentification Windows, et je teste l'existence d'un fichier sur un serveur distant. Je m'authentifie en tant que MYDOMAIN \ mon.nom d'utilisateur - cela fonctionne.File.Exists() renvoyant incorrectement false à ASP.NET - problème de sécurité lié à Thread vs Processus?

Le fichier est \ MYSERVER \ WebShare \ example.txt. Ce fichier existe. Je peux l'ouvrir à partir de différents hôtes en étant connecté en tant que MYDOMAIN \ my.username. Sous l'Explorateur Windows, les autorisations effectives indiquent que MYDOMAIN \ my.username a le contrôle total de ce fichier.

Si je joins un débogueur et le type $user dans la fenêtre de la montre, je peux voir que le fil courant fonctionne comme MYDOMAIN \ my.username, tandis que le processus actuel est toujours en cours d'exécution comme NT AUTHORITY\NETWORK SERVICE - les bits correspondants de la fenêtre de la montre sont reproduites ci-dessous:

$user {...} $user register 
+- Process {...} TOKEN 
| +- Name     NT AUTHORITY\NETWORK SERVICE User Name 
| +- User     SID S-1-5-20     SID 
| +- Session Id   0        DWORD 
| +- Loggin Id   000003e4-00000000    LUID 
| +- Impersonation Level N/A (not impersonating)  SECURITY_IMPERSONATION_LEVEL 
+- Thread {...} TOKEN 
    +- Name     MYDOMAIN\my.username   User Name 
    +- User SID    S-1-5-21-...     SID 
    +- Session Id   0        DWORD 
    +- Loggin Id   018622ef-00000000    LUID 
    +- Impersonation Level Impersonate     SECURITY_IMPERSONATION_LEVEL 

le serveur qui exécute ASP.NET est un membre du groupe MYDOMAIN \ Webservers, ce qui a le contrôle complet du fichier partagé.

Voici ce que je ne comprends pas:

  1. Lorsque .NET tente d'interroger File.Exists, est-ce le fil ou processus identité qui est utilisé?
  2. Si elle utilise les informations d'identification de processus, comment puis-je forcer le processus à s'exécuter en tant que MYDOMAIN \ my.username ou autoriser le compte NETWORK SERVICE à lire le fichier? (Je pensais que cela avait déjà été fait en ajoutant mon compte d'ordinateur - mais cela ne fonctionne pas ...)
  3. S'il utilise les informations d'identification du thread - pourquoi ne puis-je pas lire le fichier?

Tous les pointeurs ou astuces de débogage utiles seraient très appréciés.

Merci,

Dylan

+0

Quelle version du framework utilisez-vous? –

+0

J'utilise .NET Framework v3.5, développement sur Windows 7 x64 RC, déploiement sur Windows Server 2008 x86. –

+0

comment vous formatez l'arbre Processus {...} JETON ?? – Kiquenet

Répondre

2

Dans ces situations, j'ai toujours feu vers le haut Sysinternals Process Monitor et filtrer le fichier en question. À partir de là, vous pouvez voir quel compte accède réellement au fichier.

En règle générale, si vous n'empruntez pas d'identité, le compte qui exécute le pool d'applications sera utilisé. Qu'est-ce que votre compte de pool d'applications?

Concernant la question 2: Vous pouvez définir les autorisations correctes sur le fichier en cliquant avec le bouton droit de la souris dans l'Explorateur et les autorisations sélectionnées. De là, vous pouvez ajouter le compte Service réseau et lui donner des autorisations de lecture.

Quel système d'exploitation utilisez-vous? Selon le système d'exploitation, le compte du pool d'applications par défaut est Service réseau ou AppPoolIdentity, assurez-vous donc de cocher la bonne.

+0

N'avait pas pensé à essayer Process Monitor - s'avère qu'il s'agit d'une combinaison complexe d'usurpation d'identité ASP.NET et de divers autres facteurs, mais Process Monitor a absolument aidé à dépister ce qui se passait - merci. –

+0

@DylanBeattie - vous rappelez-vous quel était votre problème? Je cours dans ce qui pourrait être exactement le même problème, décrit ici: http://stackoverflow.com/questions/15212386/file-exists-returns-false-in-active-directory-environment – lhan

Questions connexes