2008-09-10 7 views
9

특정 서버에서 Path.GetTempFileName을 사용할 때 디렉터리 이름이 잘못되었다는 오류가 발생하는 문제가 발생합니다. 추가 조사는 c : \ Documents and Setting \ computername \ aspnet \ local settings \ temp (Path.GetTempPath를 사용하여 찾음)에 파일을 쓰려고 시도하고 있음을 보여줍니다. 이 폴더는 존재하므로 asp.net 계정과 관련된 사용 권한 문제 여야합니다.Path.GetTempFileName - 디렉터리 이름이 잘못되었습니다.

Path.GetTempFileName은 C : \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ temporaryasp.net 파일을 가리켜 야합니다.

이 문제는 IIS와 .NET이 서버에 설치된 순서 때문일 수도 있습니다. 나는 전형적인 'aspnet_regiis -i'를 수행했고 폴더 등등의 보안을 점검했다.이 시점에서 나는 붙어있다.

누구든지이 문제에 대해 의견을 개진 할 수 있습니까?

** 업데이트 : ** 'IUSR_ComputerName'액세스를 제공하면 트릭을 수행합니다. 이것이 올바른 절차입니까? 나는 과거에 그런 일을했던 것을 기억하지 못했고 분명히 보안 유지를위한 모범 사례를 따르기를 원합니다. 이것은 결국 파일 업로드 프로세스의 일부입니다.

답변

17

이것은 아마도 가장 및 다른 인증 방법의 불일치가 조합 된 것입니다.

많은 조각이 있습니다. 나는 그들을 하나씩 지 으려고 노력할 것이다.

가장인은 스레드가 실행되는 사용자 계정을 "일시적으로"전환하는 기술입니다. 본질적으로 스레드는 가장하고있는 계정과 동일한 권한과 액세스 권한을 얻습니다. 스레드가 웹 페이지 작성을 완료하자마자 원래 계정으로 되돌아 가서 다음 호출을 준비합니다. 이 기술은 웹 사이트에 로그인 한 사용자 만 액세스 할 수있는 리소스에 액세스하는 데 사용됩니다. 잠깐 개념을 붙잡아 라.

이제 ASP.NET은 기본적으로 ASPNET이라는 로컬 계정으로 웹 사이트를 실행합니다. 다시 말하면 기본적으로 ASPNET 계정과 Administrators 그룹의 구성원 만이 해당 폴더에 쓸 수 있습니다. 임시 폴더는 해당 계정의 권한하에 있습니다. 이것은 퍼즐의 두 번째 부분입니다.

가장은 독자적으로 발생하지 않습니다. web.config에서 의도적으로 켜야합니다.

<identity impersonate="true" /> 

설정이 없거나 false로 설정된 경우 코드는 위에 언급 된 ASPNET 계정에서 순수하고 간단하게 실행됩니다. 당신의 오류 메시지가 주어지면 나는 당신이 가장이라는 사실이 긍정적이라고 확신합니다. 거기에 아무 문제가 없습니다! 가장에는 장단점이 있습니다.

가장 가까운 질문이 하나 있는데, 가장을 사용하면 이 가장 된 계정이입니까?

web.config (full syntax of the identity element here)에서 계정을 지정하지 않으면 가장 된 계정은 IIS가 ASP.NET으로 넘겨주는 계정입니다. 그리고 그것은 사용자가 사이트를 어떻게 인증했는지에 따라 달라집니다. 그것이 당신의 세번째이자 마지막 작품입니다.

IUSR_ComputerName 계정은 IIS에서 만든 권한이 낮은 계정입니다. 기본적으로이 계정은 사용자가 인증 될 수없는 경우 웹 통화가 을 실행하는 계정입니다. 즉, 사용자는 "익명"으로 제공됩니다.

사용자가 웹 사이트에 액세스하려고하고, IIS는 어떤 이유로 사람을 인증 할 수 있습니다 : 요약

이 당신에게 무슨 일이 일어나고 있는지. 익명 액세스가 ON (또는 임시 폴더에 액세스하는 IUSRComputerName이 표시되지 않음)이기 때문에 IIS는 사용자를 일반 사용자로 허용하지만 사용자는 허용합니다. ASP.NET 코드가 실행되고이 일반 IUSR___ComputerName "guest"계정을 가장합니다. 이제 코드는 자체 임시 폴더를 포함하여 ASPNET 계정에 액세스 할 수있는 권한에 액세스 할 수 없습니다.

IUSR_ComputerName 부여 폴더에 대한 쓰기 액세스로 인해 증상이 사라집니다.

그러나 그 증상 만. 을 검토해야합니다. 그 사람이 "익명/손님"으로 오는 이유는 무엇입니까?

두 가지 가능성이 시나리오가 있습니다 : 당신은 인증을 위해 IIS를 사용하도록

A),하지만 서버 중 일부에 대한 IIS의 인증 설정이 잘못입니다.

그런 경우 일반 인증 메커니즘이 수행되도록 해당 서버에서 익명 액세스를 비활성화해야합니다. 임시 폴더에 대한 액세스 권한을 사용자에게 부여하거나 사용자가 이미 액세스 할 수있는 다른 폴더를 대신 사용해야 할 수도 있습니다.

나는이 시나리오를 여러 번 사용해 왔습니다. 솔직히 말해서 Temp 폴더를 지키지 않아도됩니다. 서버에 전용 폴더를 만들고, 적절한 권한을 설정하고, web.config에서 위치를 설정하십시오.

B) 당신은 어쨌든 사람을 인증하고 싶지 않았다, 또는 당신은 ASP.NET은 IIS에서 바이 패스 검사에 IIS의 익명 액세스를 사용하고 ASP.NET 직접 인증)

을 처리 할 수 ​​있도록 인증 (양식 사용하고 싶었

이 사례는 좀 더 복잡합니다.

IIS로 이동하여 "익명 액세스"이외의 모든 인증 방법을 해제해야합니다. 디버거에서 통합 인증을 사용하도록 설정해야하므로 개발자 상자에서는이 작업을 수행 할 수 없습니다. 따라서 디버깅 상자는 실제 서버와 조금 다르게 작동합니다. 그 사실을 알고 있어야합니다.

그런 다음 가장을 사용하지 않도록 설정할지 또는 반대로 web.config에서 가장 할 계정을 지정할지 결정해야합니다. 웹 서버가 외부 리소스 (예 : 데이터베이스)를 필요로하지 않는 경우 먼저 수행하십시오. 웹 사이트가 데이터베이스 (또는 다른 외부 리소스)에 대한 액세스 권한이있는 계정으로 실행되어야하는 경우 후자를 수행하십시오.

가장 할 계정을 지정하는 두 가지 방법이 더 있습니다. 첫째, IIS에 가서 "익명"계정을 IIS에서 관리하는 대신 리소스에 대한 액세스 권한으로 변경할 수 있습니다.두 번째 대안은 레지스트리에서 암호화 된 계정과 암호를 숨기는 것입니다. 이 단계는 약간 복잡하고이 토론의 범위를 넘어선 다.

행운을 빈다.

0

Path.GetTempPath()을 사용하여 쓰기를 시도하는 디렉토리를 찾을 수 있습니다.

2

IIS_WPG이 임시 폴더에 액세스 할 수 없기 때문일 수 있습니다. 권한 문제라고 생각되면 asp.net 작업자 프로세스에서 Procmon을 실행하고 AccessDenied 오류가 있는지 확인하십시오.

0

내 ASP.Net 응용 프로그램 중 하나와 동일한 문제가있었습니다. 나는 Path.GetTempPath()를 얻고 있었다 그러나의 예외를 던지고 :

C "파일에 쓸 수 없습니다": \ WINDOWS \ 임시 \의 somefilename을 "예외 : 액세스 경로를"C : \ Windows \ Temp \ somefilename "이 (가) 거부되었습니다."

이 페이지에서 몇 가지 제안을 시도했지만 도움이되지 않았습니다.

결국 웹 서버 (IIS 서버)로 이동하여 서버의 "C : \ Windows \ Temp"디렉터리에 대한 사용 권한을 변경하여 "Everyone"사용자에게 전체 읽기 - 쓰기 권한을 부여했습니다.

그리고 마지막으로 예외가 없어져 내 사용자가 응용 프로그램에서 파일을 다운로드 할 수있었습니다. 휴!

0

임시 파일을 쓰는 콘솔 앱을 진단하는 동안이 오류가 발생했습니다. 내 테스트 반복 중 하나에서 나는 '클린 슬레이트'실행을 위해 임시로 모든 파일/디렉토리를 제거했다. 로그 아웃하고 다시 로그인하여이 문제를 해결했습니다.

관련 문제