문제

원격 WCF 웹 서비스와 대화하는 웹 사이트가 있습니다. 둘 다 동일한 맞춤형 양식 공급자를 사용합니다. 현재 사이트에 로그인 한 사용자를 가장하는 WCF 서비스로 인증하고 싶습니다. 사용자 이름 클라이언트 자격 증명을 사용하여 이미 수동으로 수행했지만 사용자 비밀번호를 알아야합니다. 따라서, 너무 방귀는 다음과 같습니다. 인증 된 사용자가 요청을하고 서비스 클라이언트를 만들고 자격 증명을 설정합니다.

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

그러나 내가 정말로 원하는 것은 사용자 비밀번호를 저장하고 싶지 않기 때문에 Formsauthentication 쿠키를 직접 전달하는 것입니다.

어떤 아이디어?

도움이 되었습니까?

해결책

당신이 찾고있는 것 같습니다 Windows Communication Foundation 인증 서비스.

편집하다:

질문을보다 신중하게 (그리고 Ariel의 의견 후에) 다시 읽은 후 위의 제안을 철회하고 싶습니다. WCF 인증 서비스는이 시나리오에 큰 도움이되지 않습니다.

WCF와 ASP.NET 사이 에서이 작업을 수행하지는 않았지만 ASP.NET 응용 프로그램을 구성하여 인증 된 사용자를 공유하도록 구성했습니다. 어쩌면 어떤 식 으로든 도울 수 있습니다.

두 응용 프로그램 모두 양식 인증 쿠키를 동일한 방식으로 암호화/해독 할 수 있도록 구성 <machineKey> 요소 두 응용 프로그램의 경우 (web.config 또는 machine.config에서 기계 또는 애플리케이션 수준 에서이 작업을 수행할지 여부에 따라). 당신은 validation, validationKey, decryption 그리고 decryptionKey 속성.

당신을 확인하십시오 <forms> 두 Web.config 파일의 요소는 유사하게 구성됩니다. 특히 name, path 그리고 domain 속성.

이것은 웹 브라우저로 전달 된 쿠키에만 적용될 수 있지만 (이 경우 유용 할 수 있음) 웹 사이트간에 쿠키를 전달할 수 있도록합니다. www.foo.com 그리고 bar.foo.com 당신은 구성 할 것입니다 forms 한 사이트에 쿠키를 설정하고 다른 사이트에 성공적으로 전달할 수 있도록 다음과 같은 요소 :

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

쿠키를 WCF 서비스에 전달하는 것은 까다로울 수 있습니다. 나는 WCF를 경험하지 못했습니다 kennyw.com에서 코드를 조정했습니다:

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();
} 

IIS 내에서 WCF를 호스팅하는 경우 (자조 주최가 아님) 설정을 통해 ASP.NET 처리 파이프 라인을 통해 WCF 요청을 전달할 수 있습니다.

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

자체 호스팅 인 경우 들어오는 메시지 속성을 사용하여 요청 헤더를 검사 할 수 있습니다. OperationContext.Current.IncomingMessageProperties 그리고 양식 인증 쿠키 값을 가져 와서 사용하여 해독하십시오. FormsAuthentication.Decrypt(string).

나는 이것이 어떤 것이 효과가 있는지 전혀 모른다. 그러나 그것이 그렇다면 듣고 싶다!

다른 팁

인증 된 IIS 사이트 내에서 WCF 서비스를 호스팅하는 경우에는 간단합니다.

시스템에 다음을 추가하여 호환성을 활성화하십시오.

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

그런 다음 다음 서비스로 쿠키를 수락하려는 각 서비스를 장식하십시오.

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

이제 httpcontext.current.user.identity 객체가 올바르게 채워지고 Arpiniplepermission 요구 사항을 사용하여 역할 또는 특정 사용자에 대한 액세스를 제한 할 수도 있습니다.

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