2013-03-23 1 views
1

여러 POCO를 작성한 다음 DbContext (FooDbContext)를 작성한 다음 DataService < FooDbContext> calll FooDatService에서 DataService 클래스 디바이스를 작성했습니다. 실버 라이트 앱의 모든 데이터에 액세스 할 수 있으며 웹 브라우저를 시작하면 URL을 통해 예상대로 액세스 할 수 있습니다. 이제는 성공적인 로그인 후에 만 ​​DataService를 허용하려고합니다.EF 5.0 코드에 보안을 추가하는 방법 먼저 WCF DataService

+0

데이터 서비스의 호스트로 WCF 또는 MVC를 사용하고 있습니까? – Kane

+0

MVC를 사용하지 않으므로 WCF를 추측하고 있습니다. –

답변

0

WCF 서비스에 서비스 권한 부여 관리자를 추가하여 서비스의 구현을 수정하지 않고 액세스 제어하에 해당 서비스의 모든 메소드와 엔드 포인트를 배치 할 수 있습니다.

만들기 및 WCF 서비스를 시작 :

Uri[] restUris = new Uri[] { new Uri(baseUri, "Api/v1/") }; 
    // substitute your service host type here. I'm using WCF OData DataServiceHost 
    restAPIServiceHost = new DataServiceHost(typeof(API.RestAPIService), restUris); 

    var saz = restAPIServiceHost.Description.Behaviors.Find<ServiceAuthorizationBehavior>(); 
    if (saz == null) 
    { 
     saz = new ServiceAuthorizationBehavior(); 
     restAPIServiceHost.Description.Behaviors.Add(saz); 
    } 

    saz.ServiceAuthorizationManager = new MyServiceAuthorizationManager(); 

    restAPIServiceHost.Open(); 

은 Web.config의 마법을 통해 수행 할 수 있습니다. 당신의 MyServiceAuthorizationManager 구현에서

: 요청이 WCF 구현 방법에 파견되기 전에

 public class MyServiceAuthorizationManager: System.ServiceModel.ServiceAuthorizationManager 
     { 
      public override bool CheckAccess(OperationContext operationContext, ref Message message) 
      { 
       var reqProp = message.Properties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty; 
       var authHeader = new AuthorizationHeader(reqProp.Headers[HttpRequestHeader.Authorization]); 

       bool authorized = // your code to decide if caller is authorized; 

       if (!authorized) 
       { 
        var webContext = new WebOperationContext(operationContext); 
        webContext.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized; 

        // optional: give caller hints where to go to login 
        webContext.OutgoingResponse.Headers.Add(HttpResponseHeader.WwwAuthenticate, String.Format("Bearer realm=\"{0}\"", baseUri.AbsoluteUri)); 
       } 

       return authorized; 
      } 
     } 

CheckAccess 방법은, 당신의 WCF 서비스에서받은 모든 요청에 ​​대해 호출됩니다.