代码之家  ›  专栏  ›  技术社区  ›  Shyju

ASP.NET:System.UnauthorizedAccessException-拒绝访问路径

  •  8
  • Shyju  · 技术社区  · 17 年前

    我有一个ASP.NET Web应用程序,它执行以下操作:

    1. 读取Excel文件。
    2. Excel文件中会有一个指向Internet上某个位置的图像URL。
    3. 程序读取每个图像URL并将其存储到Web服务器的临时文件夹中。
    4. 然后应用程序调整图像的大小(更改宽度和高度)。
    5. 最后,应用程序会将该图像保存到另一个文件夹中。

      我收到以下例外情况:

    System.net.WebException:异常 在WebClient请求期间发生。 --->系统。未授权访问异常: 访问路径 '\abcserver\target03\3111\35644\www.testing.com\web\content\images\tempstorage\tempimage.jpg' 被拒绝。在 System.IO.\u错误.WinIOError(Int32 错误代码,字符串maybefullpath)at system.io.filestream.init(字符串路径, 文件模式,文件访问访问, Int32权限,布尔用户权限, 文件共享共享,Int32缓冲区大小, 文件选项选项, 安全属性secattrs,string msgpath,boolean bfromproxy)位于 system.io.filestream..ctor(字符串 路径,文件模式,文件访问 访问) System.NET.WebClient.DownloadFile(URI 地址,字符串文件名)---结束 内部异常堆栈跟踪---
    在processimage.getfilefromurl(字符串 imagefileurl,字符串newfilename)
    在 uploadExcelData.uploadExcelData(字符串 文件名)

     foreach (DataRow dr in dt.Rows) // Reading each excel row
                {
    
                    if (dr[0].ToString() != "")
                    {
                        id= "";
                        path = "";
                        manuId = "";
    
    
                        id= dr[0].ToString();
                        path = dr[1].ToString();
                        fileNameOnly = iProImg.GetFileNameOnly(path);
                        objDb.openConnection();
                        strSqlGroupInfo = "select ManufacturerID from  manufacturers where id='" + id+ "'";
    
                        dTblManu = objDb.BuildDT(strSqlGroupInfo); // To Fill data to Datatable
                        objDb.closeConnection();
                        if (dTblManu.Rows.Count > 0)
                        {
                            manuId = dTblManu.Rows[0][0].ToString();
                        }
    
                        if (manuId != "")
                        {
                            tempUploadPath = "images/TempStorage/";
                            tempUploadPath = Server.MapPath(tempUploadPath);
                            if (!Directory.Exists(tempUploadPath))
                            {
                                Directory.CreateDirectory(tempUploadPath);
                            }
                            tempFilePath = tempUploadPath + "\\tempImage.jpg";
                            tempFilePath = tempFilePath.Replace("/", "\\");
    
                            previewPath = Server.MapPath("images/previews/" + manuId);
                            thumbNailPath = Server.MapPath("images/thumbnails/" + manuId);
    
                            if (!Directory.Exists(previewPath))
                            {
                                Directory.CreateDirectory(previewPath);
                            }
                            if (!Directory.Exists(thumbNailPath))
                            {
                                Directory.CreateDirectory(thumbNailPath);
                            }
                            fileNameOnly = "\\preview" + id+ ".jpg";
                            fileNameOnly = fileNameOnly.Replace("/", "\\");
                            previewPath = previewPath + fileNameOnly;
                            tempPartialPathP = "images\\previews\\" + manuId + fileNameOnly;
    
                            fileNameOnly = "\\thumbnail" + id+ ".jpg";
                            thumbNailPath = thumbNailPath + fileNameOnly;
                            tempPartialPathT = "images\\thumbnails\\" + manuId + fileNameOnly;
    
    
                            try
                            {
    
                                iProImg.GetFileFromUrl(path, tempFilePath);
                                rowCounter++;
                                iProImg.ReSizeImage(tempFilePath, previewPath, previewSize);
                                iProImg.ReSizeImage(previewPath, thumbNailPath, thumbNailSize);
    
                            }
                            catch (Exception ec)
                            {
    
                                errorRowCount++;
                                iLog.LogErrorToFile("uploadExcel", ec.ToString(), "path : " + path + ",tempFilePath :" + tempFilePath);
    
    
                            }
                            finally
                            {
                                if(File.Exists(tempFilePath))
                                {
                                File.Delete(tempFilePath);
                                }
                            }
                        } // If manuid!=""
                    }  //if (dr[0].ToString() != "")
    

    有人对如何修复这个异常有什么建议吗?

    10 回复  |  直到 11 年前
        1
  •  8
  •   Samiksha    17 年前

    尝试将.NET用户的访问权限设置为“完全控制”,从中读取/保存文件。

        2
  •  4
  •   user257172    16 年前

    世界上没有答案能帮我解决这个问题,直到我偶然发现了答案:

    取消加密文件

    您可以向整个硬盘上的所有人授予完全权限,但它仍然不允许ASP.NET解密文件。

    如果您确定文件未加密,则只需将aspnet帐户添加到要访问的文件或文件夹中。但首先要确保它没有加密!

        3
  •  3
  •   Samiksha    17 年前

    答复说:“这是一个远程服务器,文件夹已被授予完全读/写权限。仍然不工作。”

    确保.NET用户/计算机帐户用户对该文件夹具有完全权限。

    另外,将<identity/>添加到配置文件中

        4
  •  3
  •   Vincent Van Den Berghe    17 年前

    确保ASP.NET帐户对要写入的文件夹具有读/写权限(基本Windows安全性)。
    如何: http://www.microsoft.com/windowsxp/using/networking/security/permissions.mspx
    (前4步,选中复选框并单击 OK )

    [编辑]
    您需要使用远程服务器上已知的帐户进行身份验证。您可能授予了远程服务器上本地ASP.NET帐户的权限,但该权限不起作用,因为(从Web服务器)访问该文件夹的用户不是本地ASP.NET帐户。
    [/编辑]

        5
  •  3
  •   MatthewMartin muthu    17 年前

    以上所有内容,加上您可能需要添加此标记:

    <identity impersonate="true" userName="accountname" password="password" />
    

    读这个 KB article 如果您要从浏览器到IIS再到文件共享,这将计为两个跃点,现在您需要配置Kerberos委托。比我更聪明的系统管理员试图配置 kerberos delegation 失败了。移动图像或IIS实例,使它们位于同一台计算机上。

        6
  •  3
  •   Bryan    17 年前

    首先,通过临时授予每个人在特定路径上的完全权限来缩小您的问题。如果它有效,那么您就知道实际上这是一个简单的权限问题,您只需要找出哪个ACCT需要适当的权限。可能是匿名用户帐户(在IIS管理中仔细检查此设置),而不是ASP.NET帐户。(别忘了为每个人争取许可)

    如果需要,我相信您可以使用filemon查看哪个帐户正在尝试访问特定文件。可能是错了,我有一段时间没用这个工具了。

    最后一件事…文件上是否设置了只读标志?:)

        7
  •  3
  •   mezoid    16 年前

    今天我也遇到了同样的问题。在花了几个小时试图找出导致问题的原因后,我发现正在写入的文件夹的权限不正确。从创建文件的用户的角度来看,文件夹基本上是只读的。

    尝试对相关文件夹执行以下操作:

    1. 右键单击文件夹并选择“属性”
    2. 单击“共享”选项卡,然后单击“权限”按钮
    3. 确保添加任何用户要写入文件夹权限的内容。
    4. 返回“属性”页,单击“安全”选项卡。
    5. 确保添加任何用户要写入文件夹权限的内容。

    鉴于这个问题是6个月前被问到的,我假设你已经解决了这个问题……但我只是想我会记录下我的解决方案,以防将来当其他人试图解决这个未经授权的访问异常时,它对他们有用。

        8
  •  1
  •   Drell    17 年前

    检查您要写入tempstorage的图像文件(JPG)是否具有webuser帐户(aspnet或iis_wpg)的适当权限。可以将tempstorage目录设置为替换所有子对象上的permissison项。

    1. 右键单击tempstorage文件夹并选择属性
    2. 选择安全选项卡(确保此处有正确的读/写/修改权限)
    3. 单击“高级”按钮
    4. 选中第二个复选框-用此处显示的适用于子对象的条目替换所有子对象上的权限条目。

    现在,添加到tempstoreage文件夹中的所有文件都将继承允许您的webuser帐户读取JPG文件的权限。

        9
  •  1
  •   aked    14 年前

    不向aspnet用户授予权限,而是向网络服务用户授予权限。文件夹中的修改权限应该足够,不需要授予完全权限(没有理由授予超过所需的权限)

    更多详情请阅读论坛: http://forums.asp.net/t/1013434.aspx/1

        10
  •  0
  •   StepUp    11 年前

    错误很明显,对路径“bin\myprojname.pdb”的访问被拒绝。运行Web控制台进程的用户(不是在Web控制台中创建的用户,实际的Windows用户),很可能“网络服务”没有访问该文件夹的权限。

    您可以-右键单击该文件夹,转到权限并添加“网络服务”用户-右键单击该文件夹,转到权限并添加“所有人”用户

    这样可以解决这个问题。

    推荐文章