5

다음과 같이 N 계층 응용 프로그램을 구성했습니다.
IIS7의 서버 쪽에서는 메서드를 노출하는 ASP.Net 응용 프로그램이 있습니다. WCF 서비스. 그 방법들은 EF4를 사용하여 DB와 대화합니다. Silverlight 4.0으로 작성된 클라이언트는 WCF 서비스의 메서드를 호출합니다.N 계층 응용 프로그램에서 WCF 및 Silverlight 4.0 : 서비스에 대한 호출을 인증합니다.

WCF 서비스는이 방법 노출 :

[OperationContract] 
void DeleteItem(int i_ItemId); 

내가 WCF 서비스를 seuring 새로운 오전,하지만 나는이 다음 관찰 (만약 내가 잘못 날 수정) 해당 생각 :

1)의 경우 이 메소드/서비스를 그대로두면 내 서비스가 http://www.mysite.com/myservice.svc에있는 것을 알고있는 사람이라면 VisualStudio를 열어서 "서비스 참조 추가"를 열고 DeleteItem()을 호출하기 시작할 수 있습니다.

2) MEX 엔드 포인트를 제거하여 위의 해결을 시도하면 일부 수동 코딩을 사용하여 서비스를 호출 할 수 있습니다.

그래서 두 가지 문제를 해결하기 위해 WCF의 기본 제공 보안 기능에 대해 배우기 시작했습니다. 얼핏 후 나는 사용자 이름과 암호가 서비스 호출을 위해 필요한되도록 난 다음 바인딩 구성을 사용할 수 있습니다 생각이 솔루션을 채택하려고

<wsHttpBinding> 
    <binding name="RequestUserName" > 
     <security mode="Message"> 
     <message clientCredentialType="UserName"/> 
     </security> 
    </binding> 

, 내 마음에 와서 제일 먼저했다 : 사용자가 클라이언트에 로그인하면 클라이언트는 사용자의 이름과 암호를 WCF 호출의 자격 증명으로 사용합니다. 서버 측에서 이러한 자격 증명은 DB에 대해 유효성이 검사됩니다.

이제 문제는 이러한 자격 증명 (userName 및 password)은 사용자에게 알려 지므로 이미 언급 한 방법으로 해당 자격 증명을 사용하여 DeleteItem()을 호출 할 수 있다는 것입니다.

1) 대신에 나는 클라이언트에서 하드 코딩 키를 사용하는 자격 증명으로 사용자 이름과 비밀번호를 사용하여 여기에서

나는 두 가지 솔루션을 함께했다. XAP 내부에서 DLL을 스크램블링하면 누군가가이 키를 얻지 못하게 될 수 있습니다.

2) 사용자가 클라이언트에 로그인하면 서버는 클라이언트가이 통신 세션 중에 호출을 인증하는 데 사용할 수있는 일종의 임시 토큰 (GUID 또는 기타)을 전송합니다 (예를 들어, 사용자 클라이언트를 닫습니다).

내 질문은 다음과 같습니다

무엇 최초의 솔루션 당신이 그것을 해독하기 위해 일할 필요가 얼마나 열심히 제공하고 보안 수준?

첫 번째 해결 방법이 매우 까다로운 경우 WCF에 두 번째 솔루션에서 언급 한 토큰 시스템을 관리하는 기본 제공 방법이 있습니까?

범위를 확장 할 수있는 다른 솔루션을 환영합니다.

답변

1

보안 수준에 대해 잘 모르겠지만 XAP 파일에 사용자 이름과 암호를 저장하는 것이 어렵다고 느끼지 않을 것입니다.

프로덕션 환경에서 구현 한 솔루션을 설명 할 수 있습니다.

기본적으로 표준 양식 인증으로 응용 프로그램의 보안을 설정하지만 일반적으로 ASP.NET에서와 같이 리디렉션을 사용하지는 않습니다. ASP.NET 양식 인증과 함께 제공되는 인증 웹 서비스를 사용합니다. 그렇게하면 내 로그인이 Silverlight 컨트롤을 통과합니다. 내 응용 프로그램에는 인증 서비스를 인증하는 사용자 저장소가 있습니다.

가 인증 서비스에 후크, 난이의 Global.asax에서 수행

protected void Application_Start(object sender, EventArgs e) 
{ 
    AuthenticationService.Authenticating += new EventHandler<AuthenticatingEventArgs>(AuthenticationService_Authenticating); 
} 

void AuthenticationService_Authenticating(object sender, AuthenticatingEventArgs e) 
{ 
    try 
    { 
     bool authenticated = //Call your user store here. 

     e.Authenticated = authenticated; 
    } 
    catch (Exception ex) 
    { 
     e.Authenticated = false; 
    } 
    e.AuthenticationIsComplete = true; 
} 

당신은 웹 사이트의 부품을 확보 할 일반적 형태의 <deny users="?"><authorization> 요소를 사용하는 것처럼. 브라우저가 모든 쿠키를 처리합니다. 서비스를 보호하려면 서비스/폴더에서 인증 된 사용자를 거부해야합니다.

MSDN Post은 솔루션에 대해 자세히 설명합니다.

+0

나는 폼 인증을 한번도 사용하지 않았습니다. 내가 아는 것은 WCF 서비스에 대한 호출을 보안하고 싶다는 것입니다. 내가 언급 한 바인딩 구성을 사용하여이를 수행 할 수 있습니다. 당신의 솔루션을 어떻게 채택 할 수 있는지 설명해 주시겠습니까? –

+0

WCF 호출에 하드 코딩 된 사용자 이름을 하나만 사용하지 않고도 사용자 저장소를 사용하여 WCF와 전체 응용 프로그램을 인증하는 방법입니다. 지금 사용자를 어떻게 인증합니까? –

+0

지금은 인증 시스템이 없습니다. 사용자의 신원과 관련하여 내가하는 유일한 작업은 로그인 페이지에서 사용자 이름과 비밀번호를 묻는 것이며, 대신 사용자의 특정 데이터를 표시합니다. 앞서 언급 한 WCF 바인딩을 사용하여 솔루션을 어떻게 사용할 수 있는지 자세히 설명 할 수 있습니까? –

관련 문제