2014-04-17 1 views
2

IIS 8, ASP.NET MVC 4, 4.5 .NETPourquoi les autorisations sont-elles bancales lorsque mon agent IIS enregistre un fichier dans ASP.NET?

private static string SaveProfilePicFile(UserProfileViewModel model) 
{ 
    var tempFilename = Path.GetTempFileName(); 

    model.ProfilePic.Profile.UploadedFile.SaveAs(tempFilename); 

    var staticContentFilename = Helpers.GetStaticContentFilename(
     StaticContentType.Avatar, model.ProfilePic.Profile.UserId); 

    var destinationFilename = Path.Combine(
     ConfigurationManager.AppSettings["StaticContentPath"], 
     "profile", 
     staticContentFilename); 

    if (File.Exists(destinationFilename)) 
     File.Delete(destinationFilename); 

    if (!HasJpegHeader(tempFilename)) // convert temp file into JPG 
    { 
     using (var image = new Bitmap(tempFilename)) 
      image.Save(destinationFilename, ImageFormat.Jpeg); 

     File.Delete(tempFilename); 
    } 
    else 
    { 
     File.Move(tempFilename, destinationFilename); 
    } 

    return staticContentFilename; 
} 

Je ne suis pas intéressé par une revue de code, je sais que les choses pourraient faire mieux. En ce moment, j'ai rencontré un problème inhabituel. StaticContentPath pointe vers c:\inetpub\wwwroot\static.domain.com, qui est desservie par un pool d'applications différent configuré pour désactiver les scripts et mettre les objets en cache plus lourd. Si je place manuellement un fichier dans le dossier de contenu statique, il servira correctement. Si le code ci-dessus (d'un pool d'applications différent) enregistre un fichier, les autorisations sont très inhabituelles. Je vais joindre des captures d'écran.

Le fichier "par défaut" est celui que j'ai collé manuellement. Il a correctement hérité des autorisations du dossier parent. Le nom de fichier hashed a été enregistré par le code ci-dessus et il n'hérite pas des autorisations correctement. Lorsque j'essaie d'accéder au fichier, j'obtiens un message d'erreur très basique d'IIS, dont l'intégralité est "La page ne peut pas être affichée car une erreur interne du serveur s'est produite". Pas de style, rien que je suis habitué à voir avec les erreurs IIS. Si j'ajoute manuellement des autorisations de lecture au compte IIS_IUSRS, tout fonctionne comme prévu. Pourquoi cela se produit-il? Que puis-je faire pour l'atténuer? Mon code doit-il être mis à jour?

Good permissionsBad permissions Good advancedBad advanced

+0

captures d'écran Publier des boîtes de dialogue avancées aussi. –

+0

Photos supplémentaires affichées. –

Répondre

2

Je soupçonne que le problème est lié à l'utilisation de Path.GetTempFileName suivie File.Move. Lorsque le fichier téléchargé est enregistré dans tempFilename, le fichier temporaire obtient toutes les autorisations affectées au dossier temporaire. Le déplacement du fichier préserve ces autorisations telles quelles au lieu de recalculer les autorisations pouvant être héritées en fonction de la destination.

Au lieu de File.Move, essayez d'utiliser File.Copy suivie File.Delete:

//File.Move(tempFilename, destinationFilename); 
File.Copy(tempFilename, destinationFilename); 
File.Delete(tempFilename); 
+0

Voir [cette entrée de blog] (http://blogs.msdn.com/b/oldnewthing/archive/2006/08/24/717181.aspx) pour plus d'informations. –

+0

Ça l'a fait, bonne prise. –

Questions connexes