我正在Visual Studio 2013上开发一个Web应用程序。在我的应用程序中,用户可以上传图像(保存到计算机的本地文件系统,发布后保存到服务器的文件系统)。我将网站发布到我的主机。但上传时出现问题。我联系了支持人员,他们告诉我他们不允许 Full Tust ,他们允许中等信任级别申请。我在web.config中添加了以下行来将应用程序的信任级别设置为medium:
<trust level="Medium" originUrl=""/>
但是当我上传文件试试时,我遇到了以下错误:
描述:应用程序尝试执行安全策略不允许的操作。授予此应用程序 必要的权限请联系您的系统管理员或更改 应用程序在配置文件中的信任级别。
异常详细信息:System.Security.SecurityException:请求类型为'System.Security.Permissions.FileIOPermission的权限, mscorlib,版本= 4.0.0.0,文化=中性, PublicKeyToken = b77a5c561934e089'失败。
有没有办法在中等信任级别上给自己 fileiopermission ?我正在寻找解决方案几周,但没有什么派上用场。
以下是导致问题的代码。
foreach (var file in uploadImages.PostedFiles)
{
//this line causes the problem
string filename = Path.GetFileName(new FileInfo(file.FileName).Name);
string[] extension = filename.Split('.');
string path = Server.MapPath("~/fortunePictures/" + randomString(16) + "." + extension.Last().ToString());
file.SaveAs(path);
DateTime now = DateTime.Now;
string date = (now.ToString("u"));
date = date.Substring(0,date.Length-1);
System.Drawing.Image img = System.Drawing.Image.FromFile(path);
insertImage(file, path, date, img, userID, fortuneID);
}
这是堆栈跟踪:
[SecurityException: Request for the permission of type 'System.Security.Permissions.FileIOPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.]
System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet) +0
System.Security.CodeAccessSecurityEngine.Check(CodeAccessPermission cap, StackCrawlMark& stackMark) +34
System.Security.CodeAccessPermission.Demand() +46
System.Security.Permissions.FileIOPermission.QuickDemand(FileIOPermissionAccess access, String fullPath, Boolean checkForDuplicates, Boolean needFullPath) +157
System.IO.FileInfo.Init(String fileName, Boolean checkHost) +42
System.IO.FileInfo..ctor(String fileName) +46
Fal_Sitesi.kahve.btnUpload_Click(Object sender, EventArgs e) in c:\Users\Ömer\Documents\Visual Studio 2013\Projects\Fal Sitesi\Fal Sitesi\kahve.aspx.cs:84
System.EventHandler.Invoke(Object sender, EventArgs e) +0
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +9717914
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +108
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +12
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +15
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +35
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +6720
System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +245
System.Web.UI.Page.ProcessRequest() +72
System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context) +22
System.Web.UI.Page.ProcessRequest(HttpContext context) +58
ASP.kahve_aspx.ProcessRequest(HttpContext context) in App_Web_n3utt0vk.0.cs:0
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +341
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +69
请帮忙。
编辑:到目前为止我做了什么
我根据此link
添加了安全策略配置说明:执行期间发生未处理的异常 当前的网络请求。请查看堆栈跟踪了解更多信息 有关错误的信息以及它在代码中的起源。
异常详细信息: System.Web.HttpException:无法读取 信任级别为“中”的安全策略文件。
错误。我尝试创建自定义安全策略文件并更改$ appDir $以外的 FileIOPermission 内容。但它也没有帮助。然后我创建新的web.config文件。我复制了web_mediumtrust.config的内容。但也没解决。最后,我删除了安全策略标记及其所有内容。我用了
<identity impersonate="true" userName="mywebsite.com\ftpUserID" password="ftpPassword"/>
使用授权连接服务器。但我无法建立联系。 (我不知道为什么,使用相同的数据我可以建立ftp连接。)
结果没有解决我的问题,我很想解决它。这是我的web.config。
<?xml version="1.0"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<system.web>
<compilation targetFramework="4.5" debug="true"/>
<httpRuntime/>
<pages controlRenderingCompatibilityVersion="4.0"/>
<customErrors mode="Off" defaultRedirect="index.aspx"/>
<trust level="Medium" originUrl=""/>
</system.web>
</configuration>
我使用此配置获得 System.Security.SecurityException 。
编辑2 :我根据此link将<location path="myAppName" allowOverride="false">
添加到配置文件中。现在,该应用程序正确地在 localhost 上运行。但是已发布的网站仍然会出错。这是我的web.config文件的最后一个版本:
<?xml version="1.0"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<location path="myAppName" allowOverride="false">
<system.web>
<compilation targetFramework="4.5" debug="true"/>
<httpRuntime/>
<pages controlRenderingCompatibilityVersion="4.0"/>
<customErrors mode="Off" defaultRedirect="index.aspx"/>
<trust level="Medium" originUrl=""/>
</system.web>
</location>
</configuration>
答案 0 :(得分:0)
这是中等信任的常见问题。
您应该能够在配置中使用身份模拟来解决它:
<system.web>
<identity impersonate="true" userName="HOSTING\myUserName" password="myPassword"/>
</system.web>
此处有更多详情: https://forums.asp.net/t/1052417.aspx
登录工作的确切程序取决于您的托管解决方案,您不能提供任何详细信息。
你也可以在SO上找到一些资源:Unable to upload a file in medium trust但是这个具体问题是指另一个似乎因任何原因被删除的问题。
答案 1 :(得分:0)
好吧,我找到了解决方案并且非常简单:(在我的情况下,我使用了
string filename = Path.GetFileName(new FileInfo(file.FileName).Name);
获取文件名,这是不必要的。我不知道为什么会这样做但是
string filename = file.FileName
足以获取上传文件的文件名。其余代码相同,web.config文件的最后状态为:
<?xml version="1.0"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<system.web>
<compilation targetFramework="4.5" debug="true"/>
<httpRuntime/>
<pages controlRenderingCompatibilityVersion="4.0"/>
<customErrors mode="Off" defaultRedirect="index.aspx"/>
<trust level="Medium" originUrl=""/>
</system.web>
</configuration>