2009-07-18 14 views
5

Silverlight v3 웹 응용 프로그램에서 작업 중이며 데이터를 가져 오는 데 사용하고있는 WCF 서비스에 대한 액세스를 보호하려고합니다. 현재 WCF는 정상적으로 작동하지만 사용자 자격 증명이 필요하지 않습니다.WCF + 사용자 자격증 명

저는 WCF의 이러한 측면에 대해서는 경험이별로 없기 때문에 제 첫 생각은 각 서비스 작업에 사용자 이름과 암호 매개 변수를 추가하는 것이 었습니다. 내가 가진 문제는 많은 중복 코드와 사용자 이름과 암호가 일반 텍스트의 전선을 통해 전송된다는 사실입니다.

내가 원하는 것은 내 서비스 프록시를 만든 직후에 클라이언트 측에서 자격 증명을 지정하는 방법입니다 ("서비스 참조 추가"에서 자동 생성 된 프록시를 사용하고 있습니다).

이 솔루션에 대한 인터넷 검색 때, 나는 (사용자 이름/암호 매개 변수를 사용하여) 나의 첫 번째 아이디어와 유사한 해결책을 찾을 수있었습니다. 누군가가 올바른 방향으로 나를 가리켜 주시겠습니까?

감사합니다.

답변

7

이러한 사용자 이름과 비밀번호는 어디에서 발생합니까? 웹 사이트에서 양식 인증을 이미 구현 한 경우 직접 자격 증명을 무시하고 양식 인증 쿠키를 사용할 수 있습니다.사용자가 로그인하면 쿠키는 웹 서비스 호출과 함께 이동합니다. 다른 쪽에서 읽으려면 몇 가지 변경해야합니다. 즉, 각 서비스 방법에 대한 다음 완료되면 당신은 ASP.NET 쿠키가 추가 이해 할

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

:

먼저 당신이는 system.serviceModel 섹션에서 WCF에 대한 ASP.NET 호환 모드를 활성화해야 [AspNetCompatibilityRequirements] 당신이 사용자의 신원을 발견하기 위해 HttpContext.Current.User.Identity 개체에 액세스 할 수있는 각 방법에서 이제 서비스 클래스

[ServiceContract] 
[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class ExampleService 
{ 
} 

에 속성.

당신이 특정 방법을 원하는 경우에

은 당신이 ASP.NET의 역할 공급자 다음 그 또한 채워집니다를 사용하는 경우 다음 보너스 같이 PrincipalPermission 따라서

[OperationContract] 
[PrincipalPermission(SecurityAction.Demand, Authenticated=true)] 
public string Echo() 

를 사용할 수있는 인증 된 사용자에 의해 호출하고, 당신은 특정 역할의 멤버로 제한하는 방법에 PrincipalPermission를 사용할 수 있습니다

[OperationContract] 
[PrincipalPermission(SecurityAction.Demand, Role="Administators")] 
public string NukeTheSiteFromOrbit() 

그리고 이것은뿐만 아니라 분명히 Silverlight2에서 작동합니다.

+0

좋아 보인다. 원시 httpwebrequest를 사용하는 경우이 (또는 비슷한) 사용 가능 여부를 알 수 있습니까? 나는 같은 방식으로 보안 싶습니다 사용자 지정 RPC 스택이 있습니다 (나는 사소한 대답이 있다면 물론 새로운 queston로 요청할 수 있습니다) –

+0

그래야합니다; http://www.silverlightshow.net/items/Cookies-in-Silverlight-Web-Requests.aspx – blowdart

+0

Ta; 나는 그것을 볼 것이다 ;-p –

0

인증 개체의 일종을 전달하고 WCF를 사용하여 메시지 수준에서 암호화 할 수 있습니다. 그런 다음 중복 논리를 피하기 위해 C# 요소 (http://www.postsharp.org/)를 사용할 수 있습니다. 그것을 다루는 매우 깨끗한 방법.

1

자기 자신을 구르거나 명시 적 매개 변수를 추가하지 마십시오. 실제로 너무 많은 작업입니다!

WCF 보안 기능을 확인하십시오. 사용 가능한 기능이 많이 있습니다! 예 : 메시지를 보호하고 메시지 안에 자격 증명을 포함 시키십시오. 즉석에서 별도로 코딩 할 필요가 없습니다!

체크 아웃이 우수한 미셸 레녹스 부스타하여 WCF 보안에 대한 기사 : 귀하의 경우 http://www.devx.com/codemag/Article/33342

, 나는 사용자 이름 자격 증명을 사용하여 메시지 보안을 건의 할 것입니다 - 당신은 양쪽 끝이를 구성해야합니다

서버 측 : 클라이언트 측에서 동일한 설정을 적용 할 필요가

<bindings> 
    <basicHttpBinding> 
    <binding name="SecuredBasicHttp" > 
     <security mode="Message"> 
     <message clientCredentialType="UserName"/> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<services> 
    <service name="YourService"> 
    <endpoint address="http://localhost:8000/MyService" 
       binding="basicHttpBinding" 
       bindingConfiguration="SecuredBasicHttp" 
       contract="IYourService" /> 
    </service> 
</services> 

그리고 :

<bindings> 
    <basicHttpBinding> 
    <binding name="SecuredBasicHttp" > 
     <security mode="Message"> 
     <message clientCredentialType="UserName"/> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<client> 
    <endpoint address="http://localhost:8000/MyService" 
       binding="basicHttpBinding" 
       bindingConfiguration="SecuredBasicHttp" 
       contract="IYourService" /> 
</client> 

이제 서버와 클라이언트가 보안에 동의 - 클라이언트에서, 당신은 다음과 같이 사용하는 사용자 이름과 암호를 지정하는 것 :

서버 측에
YourServiceClient client = new YourServiceClient(); 

client.ClientCredentials.UserName.UserName = "your user name"; 
client.ClientCredentials.UserName.Password = "top$secret"; 

, 당신이 필요합니다 일반적으로 Windows 도메인 (Active Directory) 또는 ASP.NET 멤버 자격 공급자 모델에 대해 이러한 사용자 자격 증명의 유효성을 검사하는 방법을 설정합니다. 어떤 경우에도 정의한 상점에 ​​대해 사용자 신임을 확인할 수 없으면 호출이 거부됩니다.

희망 사항은 WCF에서 비트 보안이 큰 주제이며 많은 옵션을 가지고 있습니다. 조금 어려울 수 있지만 결국에는 일반적으로 의미가 있습니다! :-)

마크

+6

이 시나리오를 수행 할 수있는 시나리오가 확실하지 않지만 내 경험에 따르면 WCF에서는 허용되지 않습니다. basicHttpBinding에서는 메시지 모드 사용자 이름 - 자격 증명 보안을 사용할 수 없으며 자격 증명이 일반 텍스트로 전달되기 때문에 프레임 워크에서 허용하지 않습니다. 이 InvalidOperationException이 발생합니다 : "BasicHttp 바인딩을 사용하려면 BasicHttpBinding.Security.Message.ClientCredentialType이 보안 메시지의 BasicHttpMessageCredentialType.Certificate 자격 증명 유형과 동일해야합니다 .Transport 또는 TransportWithMessageCredential Security for UserName 자격 증명을 선택하십시오." – Grank

관련 문제