문제

특정 서버에서 Path.GetTempFileName을 사용할 때 디렉터리 이름이 유효하지 않다는 오류가 발생하는 문제가 발생합니다.추가 조사에 따르면 c:\Documents 및 Setting\computername\aspnet\local settings emp(Path.GetTempPath를 사용하여 검색됨)에 파일을 쓰려고 시도하고 있는 것으로 나타났습니다.이 폴더가 존재하므로 이것이 asp.net 계정과 관련된 권한 문제인 것으로 가정합니다.

Path.GetTempFileName이 C:\Windows\Microsoft.NET\Framework\v2.0.50727 emporaryasp.net 파일을 가리켜야 한다는 말을 들었습니다.

또한 이 문제는 IIS와 .NET이 서버에 설치된 순서로 인해 발생할 수 있다는 말을 들었습니다.나는 일반적인 'aspnet_regiis -i'를 수행하고 폴더 등에 대한 보안을 확인했습니다.이 시점에서 나는 막혔습니다.

누구든지 이것에 대해 밝힐 수 있습니까?

**업데이트:**폴더에 'IUSR_ComputerName' 액세스를 제공하면 효과가 있다는 것이 밝혀졌습니다.그게 올바른 절차인가요?과거에 그런 일을 한 기억이 없는 것 같으며 보안을 유지하기 위해 모범 사례를 따르고 싶습니다.이는 결국 파일 업로드 프로세스의 일부입니다.

도움이 되었습니까?

해결책

이는 아마도 가장과 다양한 인증 방법의 불일치가 결합된 것일 수 있습니다.

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

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

이제 기본적으로 ASP.NET은 다음과 같은 로컬 계정으로 웹 사이트를 실행합니다. ASPNET.다시 말하지만, 기본적으로 ASPNET 계정과 관리자 그룹의 구성원만 해당 폴더에 쓸 수 있습니다.임시 폴더는 해당 계정의 권한에 속합니다.이것이 퍼즐의 두 번째 조각입니다.

가장은 저절로 발생하지 않습니다.web.config에서 의도적으로 활성화해야 합니다.

<identity impersonate="true" />

설정이 없거나 false로 설정된 경우 코드는 위에서 언급한 ASPNET 계정 하에서 순수하게 실행됩니다.오류 메시지를 보면 impersonation=true라고 확신합니다.그건 아무 문제가 없습니다!가장에는 이 논의를 넘어서는 장점과 단점이 있습니다.

한 가지 질문이 남았습니다.가장을 사용하는 경우 어떤 계정이 가장되나요??

web.config에서 계정을 지정하지 않는 한(여기에 ID 요소의 전체 구문이 있습니다.), 가장된 계정은 IIS가 ASP.NET에 넘겨준 계정입니다.이는 사용자가 사이트에 어떻게 인증했는지 여부에 따라 달라집니다.그것이 세 번째이자 마지막 작품입니다.

IUSR_ComputerName 계정은 IIS에서 만든 낮은 권한 계정입니다.기본적으로 이 계정은 웹 호출이 실행되는 계정입니다. 사용자를 인증할 수 없는 경우.즉, 사용자는 "익명"으로 들어옵니다.

요약하자면, 당신에게 일어나고 있는 일은 다음과 같습니다:

사용자가 웹 사이트에 액세스하려고 하는데 IIS가 어떤 이유로든 해당 사용자를 인증할 수 없습니다.익명 액세스가 켜져 있거나 IUSRComputerName이 임시 폴더에 액세스하는 것을 볼 수 없기 때문에 IIS는 사용자를 일반 사용자로 허용합니다.ASP.NET 코드는 이 일반 IUSR___ComputerName "guest" 계정을 실행하고 가장합니다.이제 코드는 자체 임시 폴더를 포함하여 ASPNET 계정이 액세스할 수 있었던 항목에 액세스할 수 없습니다.

폴더에 대한 IUSR_ComputerName WRITE 액세스 권한을 부여하면 증상이 사라집니다.

그러나 그것은 단지 증상일 뿐입니다.검토해야합니다 왜 그 사람이 "익명/손님"으로 오나요?

두 가지 가능한 시나리오가 있습니다.

a) 인증에 IIS를 사용하려고 했지만 일부 서버에 대한 IIS의 인증 설정이 잘못되었습니다.

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

저는 이 시나리오를 여러 번 사용해 보았으며 솔직히 말해서 Temp 폴더를 사용하지 않는 것이 골치 아픈 일을 줄여줍니다.서버에 전용 폴더를 만들고, 적절한 권한을 설정하고, web.config에서 위치를 설정하세요.

b) 어쨌든 사람들을 인증하고 싶지 않거나 ASP.NET 양식 인증(IIS의 익명 액세스를 사용하여 IIS의 검사를 우회하고 ASP.NET에서 인증을 직접 처리할 수 있음)을 사용하고 싶었습니다.

이 경우는 좀 더 복잡합니다.

IIS로 이동하여 "익명 액세스" 이외의 모든 형태의 인증을 비활성화해야 합니다.디버거를 활성화하려면 통합 인증이 필요하기 때문에 개발자 상자에서는 이를 수행할 수 없습니다.따라서 디버깅 상자는 실제 서버와 약간 다르게 작동합니다.그냥 알아두세요.

그런 다음 가장을 꺼야 하는지 아니면 반대로 web.config에서 가장할 계정을 지정해야 하는지 결정해야 합니다.웹 서버에 외부 리소스(예: 데이터베이스)가 필요하지 않은 경우 첫 번째 작업을 수행하세요.웹 사이트가 데이터베이스(또는 기타 외부 리소스)에 액세스할 수 있는 계정으로 실행되어야 하는 경우 후자를 수행하십시오.

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

행운을 빌어요!

다른 팁

그럴 수도 있지 IIS_WPG 임시 폴더에 대한 액세스 권한이 없습니다.권한 문제라고 생각되면 다음을 실행하세요. 프로크몬 asp.net 작업자 프로세스에서 AccessDenied 오류를 확인하세요.

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

당신이 사용할 수있는 경로.GetTempPath() 어느 디렉토리에 쓰려고 하는지 알아보세요.

내 ASP.Net 응용 프로그램 중 하나에서 동일한 문제가 발생했습니다.나는 점점 경로.GetTempPath() 하지만 다음과 같은 예외가 발생했습니다.

""C:\Windows emp\somefilename" 파일에 쓸 수 없습니다. 예외:"C:\Windows emp\somefilename" 경로에 대한 액세스가 거부되었습니다."

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

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

그리고 마침내 예외가 사라졌고 사용자는 애플리케이션에서 파일을 다운로드할 수 있었습니다.휴!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top