2010-05-20 1 views
0

IIS에서 실행중인 .NET 3.5 웹 서비스 (가 아님)가 있습니다. 타사 소프트웨어를 인증하려면 identity impersonate="true" 및 Windows 통합 인증을 사용해야합니다. 또한 ADO.NET 및 SQL Server 인증 (연결 문자열에 고정 된 사용자 ID 및 암호 지정)을 사용하여 SQL Server 데이터베이스에 연결합니다.IIS에서 Windows 통합 인증으로 인해 ADO.NET 오류가 발생했습니다.

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

이 : 데이터베이스가 SQL 서버 B (. 어느 웹 서버와 동일) 그리고 웹 서비스는 다음과 같은 예외를 슬로우로 SQL 서버 A에서 이동 될 때까지

다 괜찮 았는데 오류 은 Web.config에서 ID 가장 (impersonate)가 true 인 경우 발생합니다.

다시 연결 문자열은 변경되지 않고 사용자를 지정합니다. 연결 문자열을 테스트 한 결과, 가장 된 계정과 서비스 계정 (및 원격 시스템과 서버 모두)에서 모두 작동합니다.

가장을 사용하려면이 변경 사항을 변경해야합니까?

편집 :

레무스 Rusanu 올바른 방향으로 우리를 지적했다. 그것은 Kerberos로 내려갔습니다 - SPN은 새 서버로 설정되지 않았습니다. asp.net via kerberos integrated windows authentication to sql server을 참조하십시오. 고맙습니다!

답변

3

가장을 사용하고 다른 호스트의 리소스에 액세스 할 때 위임이 발생합니다 (평신도가 '두 홉'이라고 부르는 것). 위임은 기본적으로 제한되어 있으므로 제한 위임을 명시 적으로 설정하지 않으면 인증이 실패합니다.

하지만 SQL 인증을 사용하고 SQL 인증은 NTLM/Kerberos '리소스'가 아닙니다.사실, 당신도 사용하지만 명명 된 파이프을 사용하고 명명 된 파이프 NTLM/Kerberos 리소스이므로 대표단 이됩니다.

SQL Server가 TCP에서 수신 대기하는지 확인하려면 How to: Configure Client Protocols을 참조하고 클라이언트가 특정 프로토콜 (예 : 명명 된 파이프를 먼저 시도하지 않음)을 선택하도록하는 방법은 Configuring Client Network Protocols을 참조하십시오. 또한 연결 문자열에서 서버 이름 앞에 tcp:을 단순히 추가하여 TCP를 강제 적용 할 수 있습니다. 위임이 문제가 될 경우

+0

"tcp :"를 추가하면 "(공급자 : TCP 공급자, 오류 : 0 - 대상 컴퓨터가 적극적으로 거부했기 때문에 연결할 수 없습니다.)"로컬 컴퓨터에서이 작업을 시도해 볼 수 있습니다. 나는 "tcp :"를 없앤다. – TrueWill

+1

서버가 TCP를 수신 대기하도록 구성되지 않았거나 기본 포트에서 수신 대기하지 않습니다. –

0

웹 서비스 자체에서 가장을 사용하고 있습니까?

웹 서비스의 가장은 IIS와 다른 계층에서 작동합니다. 클라이언트에서 웹 서비스로 이동하려면 익명 모드가 설정된 상태에서도 identity = impersonate를 해제하고 ServiceSecurityContext에서 사용자 토큰을 가져올 수 있습니다.

웹 서비스에서 해당 토큰을 가장하려면 ServiceSecurityContext에서 WindowsCredential을 가져 와서 using 문에서 credential.Impersonate() 메서드를 호출하여 using 블록 내부의 데이터베이스에 연결합니다. 이 과정에서 다른 다리를 필요로하는 경우

public class HelloService : IHelloService 
{ 
    [OperationBehavior] 
    public string Hello(string message) 
    { 
     WindowsIdentity callerWindowsIdentity = 
     ServiceSecurityContext.Current.WindowsIdentity; 
     if (callerWindowsIdentity == null) 
     { 
      throw new InvalidOperationException 
      ("The caller cannot be mapped to a WindowsIdentity"); 
     } 
     using (callerWindowsIdentity.Impersonate()) 
     { 
      // Access a file as the caller. 
     } 
     return "Hello"; 
    } 
} 

또한, (즉, 백엔드 서비스는 다른 서버에), 당신은 자격 증명을 전달하기 위해 위임을 사용해야합니다. 이것을 선언적으로 수행 할 수도 있습니다. 자세한 내용은이 기사를 참조하십시오. http://msdn.microsoft.com/en-us/library/ms730088.aspx

+0

IIS 및이 서비스의 Web.config를 통해 가장 (impersonation)를 사용하고 있습니다. 잠재적으로 기술을 사용하면 ADO.NET을 호출하는 동안이 아닌 타사 소프트웨어를 호출 할 때 가장 할 수 있지만 SQL Server를 이동하기 전에 코드를 복잡하게 만들 수 있습니다. 우리는 또한 WCF를 사용하지 않기 때문에 위임 링크가 관련성이없는 것 같습니다. – TrueWill

+0

WCF를 사용하지 않는다는 사실을 알지 못했거나 SQL 서버가 절대로 같은 상자에 없다는 것을 알지 못했습니다. 내가 게시 한 코드는 IIS를 통해 가장이 수행되지 않으므로 WCF에 필요한 코드입니다. 혼란에 대한 미안, 그리고 해명에 대한 감사합니다 –

+0

고마워요 - 내가 명확하게 원래 게시물에 메모를 추가했습니다. – TrueWill

0

SQL Server가 동일한 상자에있을 때 작동했기 때문에 트랜잭션에 연결할 수있었습니다.

MSDTC를 사용하려고 시도했을 수 있으며 가장 된 사용자에게 일부 권한이없는 것일 수 있습니다.

시도해 볼 수있는 또 다른 방법은 가장하려는 사용자로 웹 서버에 로그온하고 SQL Server에 연결할 수 있는지 확인하는 것입니다.

+0

나는 그것을 명확하게하기 위해 질문을 편집했다. SQL Server (이전 또는 신규)도 웹 서버와 동일한 상자에 없었습니다. – TrueWill

0

은, 제한된 위임에 대한 계정을 설정하는 방법을 볼 수 http://msdn.microsoft.com/en-us/library/ms730088.aspx

는 맨 아래로 이동 제한된 위임을 가능하게하기 위해이 문서를 참조하십시오. WCF 기사를 알고 있지만 위임을 사용하기 위해 계정을 설정하는 프로세스는 동일해야합니다. 레무스 설명으로

더 자세한 사항은, 또는 여기 http://technet.microsoft.com/en-us/library/cc739587(WS.10).aspx

를 이동, 당신의 SQL 서버가 TCP 접속 및 접속을 그런 식으로 수 있습니다.