2009-07-06 3 views
11

원격 WCF 웹 서비스와 통신하는 웹 사이트가 있습니다. 두 가지 모두 동일한 사용자 지정 FormsAuthentication 공급자를 사용합니다. 현재 사이트에 로그인 한 사용자 인 것처럼 위장한 WCF 서비스로 인증하고 싶습니다. 이미 UserName 클라이언트 자격 증명을 사용하여이 작업을 수동으로 수행했지만 사용자 암호를 알아야합니다. 그래서, 무엇을 작동하기 때문에 방귀는 이것이다 : 인증 된 사용자가 요청을, 나는 그의 자격 증명을 서비스 클라이언트를 생성하고 설정합니다FormsAuthentication 쿠키를 WCF 서비스에 전달

serviceClient.ClientCredentials.UserName.UserName = username; 
serviceClient.ClientCredentials.UserName.Password = password; 

하지만 내가 정말 원하는 것은 직접하고 FormsAuthentication 쿠키를 통과 나는 돈 때문에하는 것입니다 사용자 암호를 저장하고 싶지 않습니다.

아이디어가 있으십니까?

+0

안녕하세요 아리엘, 어떻게이 일을 시작하셨습니까? 나는 비슷한 문제를 가진 사람을 안다. –

답변

13

Windows Communication Foundation Authentication Service을 찾는 것처럼 들립니다.

편집 : 나는 위의 제안을 철회하고 싶습니다 더 신중하게 질문을 다시 읽기 (그리고 아리엘의 코멘트 후) 후

. WCF 인증 서비스는이 시나리오를 많이 추가하지 않습니다.

WCF와 ASP.NET간에이 작업을 수행하지는 않았지만 폼 인증 된 사용자를 공유하도록 ASP.NET 응용 프로그램을 구성했습니다. 어쩌면 도움이 될 것입니다.

두 응용 프로그램이 폼 인증 쿠키를 같은 방법으로 암호화/암호 해독 할 수 있도록하려면 두 응용 프로그램 모두에 대해 configure the <machineKey> element이어야합니다 (컴퓨터 또는 응용 프로그램 수준에서이 작업을 수행할지 여부에 따라 web.config 또는 machine.config). validation, validationKey, decryptiondecryptionKey 속성을 확인해야합니다.

두 web.config 파일의 <forms> 요소가 비슷하게 구성되었는지 확인하십시오. 특히 name, pathdomain 속성

이것이 단지 웹 브라우저에/전달 된 쿠키에 적용됩니다 (단,이 경우에 유용 할 수있는) 가능성이 높습니다 : 쿠키는 웹 사이트 사이를 통과 할 수 있도록 www.foo.combar.foo .COM 쿠키를 다른 하나 개의 사이트에서 설정하고 성공적으로 통과 할 수 있도록 다음과 같이 당신이 forms 요소를 구성합니다 :

<forms ... domain=".foo.com" ... /> 

WCF 서비스에 쿠키를 전달은 까다로운 비트 될 가능성이 높습니다. 나는 매우 매우 I've adapted code from kennyw.com, WCF와 경험이 아니에요 :

HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty(); 
httpRequestProperty.Headers.Add(HttpRequestHeader.Cookie, "<Forms Authentication Cookie>"); 

using (OperationContextScope scope = new OperationContextScope(serviceClient.InnerChannel)) 
{ 
    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty; 
    serviceClient.MethodName(); 
} 

당신은

을 설정하여 ASP.NET 처리 파이프 라인을 통해 WCF 요청을 전달할 수 있습니다 IIS (그리고 자기 호스팅) 내에서 WCF를 호스팅하는 경우
<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" ... /> 
</system.serviceModel> 

당신이 OperationContext.Current.IncomingMessageProperties에서 수신 메시지의 속성을 사용하여 요청 헤더를 검사하고 폼 인증 쿠키 값을 얻을 FormsAuthentication.Decrypt(string)를 사용하여 암호를 해독 할 수 호스팅 자신을 경우.

이 중 어떤 것이 작동하는지는 잘 모르겠지만 실제로 작동하는지는 잘 모르겠다.

+0

인증 서비스가 어떻게 도움이되는지 모르겠습니다. 내 시나리오는 다음과 같습니다. USER -> 웹 사이트 A -> 다른 곳에 호스팅 된 WCF 서비스 B 사용자가 A, A에 로그인하면 사용자 자격 증명을 사용하여 B를 호출합니다. 인증 서비스를 어디에 추가 하시겠습니까? –

+0

안녕하세요. 죄송합니다. 정말로 귀하의 질문을 읽지 않고 너무 빨리 대답하려고 시도했습니다. 업데이트로 편집하겠습니다. – dariom

+0

제안을 주셔서 감사 드리며, 여기에 결과를 공유하겠습니다. –

4

인증 된 IIS 사이트 내에서 WCF 서비스를 호스팅하는 경우 간단하게 수행 할 수 있습니다.

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
</system.serviceModel> 

이 그럼 당신은 이제 다음

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

와 쿠키를 허용하고자하는 각 서비스를 장식 당신의 Web.config에서 귀하는 system.serviceModel 섹션에 다음을 추가하여 호환성을 활성화 HttpContext.Current.User.Identity 개체가 올바르게 채워지고 PrinciplePermission 요구를 사용하여 역할이나 특정 사용자의 액세스를 제한 할 수 있습니다.

+0

글쎄, 그게 문제, 나는 동일한 IIS를 사용할 수 없습니다. 내가 만들고있는 시스템에 대한 요구 사항은 웹 사이트와 서비스를 별도의 컴퓨터에서 호스팅하는 것이 었습니다. 공유 토큰을 사용할 것을 고려하고 있지만 Forms를 사용하는 것이 ASP.net에서 오는 가장 간단한 솔루션입니다. –

+0

아 아아! 최소한 동일한 도메인 이름에 넣을 수 있습니까? 그렇다면 양식 인증 쿠키 범위를 설정하고 그런 식으로 공유 할 수 있습니다. – blowdart

+0

내 생각에이 응용 프로그램은 단일 루트 도메인 아래의 인트라넷에서 호스팅됩니다. 동일한 컴퓨터 키를 설정할 수도 있지만 사용자가 웹 사이트에 액세스하고 웹 사이트에서 사용자를 가장하는 데이터 소스로 WCF를 사용한다는 점을 명심하십시오. 그것은 Windows 인증 잘 작동하지만 FormsAuthentication 쿠키를 전달하는 것은 다른 이야기입니다. 다리우스 제안 (또는 다른 가능한 경우)을 시도해 보겠습니다. –