2010-12-13 4 views
0

XML 형식의 요청을 웹 서버에 보내는 웹 클라이언트가 있습니다. 웹 서버는 (다소 큰) 파일을 만들어 캐시 된 디렉토리에 저장하고 응답 스트림을 통해 웹 클라이언트에 반환합니다. 이 잘 나는 그것을 시도 처음 몇 시간을 일하지만, 갑자기 그것이 작동을 중지하고 (XML에 싸여) 다음과 같은 예외가보고 :내 ASPX 페이지가 웹 서버의 디렉토리에 액세스 할 수없는 이유는 무엇입니까?

<error type="System.Security.SecurityException"> 
    <message>Request for the permission of type 'System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.</message> 
    <stack-trace><![CDATA[ at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet) 
    at System.Security.CodeAccessPermission.Demand() 
    at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) 
    at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) 
    at System.IO.FileStream..ctor(String path, FileMode mode) 
    at Ionic.Zip.SharedUtilities.CreateAndOpenUniqueTempFile(String dir, Stream& fs, String& filename) 
    at Ionic.Zip.ZipFile.get_WriteStream() 
    at Ionic.Zip.ZipFile.Save() 
    at Ionic.Zip.ZipFile.Save(String fileName) 
    at MyApplication.UpdateItemFiles.GetUpdateContent(XDocument a_xManifest, Stream[] a_arrExtraContent) in C:\Software\MyApplication\Alpha\Web Interface\UpdateItemFiles.aspx.cs:line 265 
    at MyApplication.UpdateItemFiles.Page_Load(Object sender, EventArgs e) in C:\Software\MyApplication\Alpha\Web Interface\UpdateItemFiles.aspx.cs:line 31]]></stack-trace> 
</error> 

내가 코드 액세스 보안에 대해 잘 모르겠어요. 나는 심지어 모든 사람에게 디렉토리에 대한 모든 권한을 부여하려고 노력했습니다. 이것은 개발 서버이며 공용 컴퓨터가 아니기 때문에 문제가되지 않습니다. 나는 이것이 왜 처음 몇 시간 동안 효과가 있었는지 이해하지 못한다. 그러나 지금 일하는 것을 그만 둔다.

저는 Windows 7 64 비트에서 Visual Studio 2008을 서버와 클라이언트 (동일한 컴퓨터)에 사용하고 있습니다. IIS 7.0과 .Net Framework 3.5를 사용하고 있습니다.

편집 2010년 12월 13일 동부 표준시 16시 05분 : 내가는 CodePlex에서 DotNetZip 라이브러리를 사용하고 있기 때문에이 오류를 받고 있어요

. IIS 나 구성에 어셈블리를 추가 할 수 있습니까?

+0

아니야. –

+0

SQL Server를 사용하고 있어야합니다. 맞습니까? – Jordan

답변

1

ASP.NET 응용 프로그램의 사용자 자체의 보안 설정을 수정하는 대신 파일 액세스를 수행하는 새 파일 액세스 응용 프로그램 (아마도 WCF의 원격 액세스를 통해 액세스 할 수있는 Windows 서비스)을 만드는 것이 좋습니다. 이 응용 프로그램은 파일 액세스에 필요한 컨텍스트를 사용하여 실행할 수 있습니다.

ASP.NET 응용 프로그램은 파일 액세스 응용 프로그램과 통신 할 수 있어야합니다. 이렇게하면 보안이 강화되고 ASP.NET 응용 프로그램에서 사용하는 계정이나 사용자를 가장하는 것에 대해 걱정할 필요가 없습니다.

+0

제외하고는, 나는 리모팅이나 WCF에 관해 전혀 모른다. – Jordan

+0

시간을내어 배우는 것이 가치가 있습니다. 너무 깊이 이해하지 못하는 경우에도 훌륭한 엔터프라이즈 응용 프로그램에는 서비스 계층이 있으며 WCF는 .NET 원격 작업이 진행되는 곳인 것처럼 보입니다. 단기적으로는 인터넷 검색을 시도하십시오.NET Remoting "hello world"app - 클라이언트와 서버를위한 app.config에는 단지 몇 개의 클래스와 몇 줄만 생성 할 필요가 없습니다. –

+0

나는이 길을 찾았지만 거절당했습니다. 못생긴 해결책을 찾았지만 효과가 있습니다. 나는 이것을 사용하지 않았지만이 답변이 가장 마음에 든다. 내 솔루션은 아래 있습니다. – Jordan

1

웹 사이트가 실행되는 사용자는 기본적으로 매우 적은 priv를 갖기 때문에. 가장 좋은 방법은

  1. 에 당신이 필요로하는 바로 privs 및 사용하여 새 사용자 만들기입니다 - SQL 액세스, 특정 폴더 등을
  2. 웹에서 가장을 사용하는 사용자로 실행하도록 응용 프로그램을 설정
  3. . config

그런 식으로 응용 프로그램의 로컬에서 변경 사항을 유지하고 기본 사용자와 동일한 서버에서 실행중인 다른 응용 프로그램의 보안 문제를 피할 수 있습니다.

+0

이것은 작동하지 않았습니다. 아마도 IIS 7.0을 사용하고 있기 때문일 수 있습니다. 익명 사용자 IUSR_COMPUTERNAME에 대한 설명서를 읽었습니다. 이 사용자가 없습니다. – Jordan

0

문제가있는 어셈블리는 Iconic.Zip입니다. Zip 아카이브를 만드는 데 사용하고있었습니다. IIS 서버가이를 신뢰하지 않아 코드 액세스 보안 검사를 통과하지 못했습니다. 내 솔루션 내 자신의 코드 내에서 스트림을 만드는 것이었다. 이 단점은 ZipFile 유형이 한 번에 모든 읽기 및 쓰기를 수행하기 때문에 아카이브를 저장할 때까지 스트림을 열린 상태로 두어야한다는 것입니다.

관련 문제