2013-03-23 72 views
1

我創建了幾個POCO,然後創建了一個DbContext(FooDbContext) - 然後我從DataService創建了一個DataService類設備FooDbContext> calll FooDatService。我可以訪問我的Silverlight應用程序中的所有數據,如果我啓動了Web瀏覽器,則可以按照預期通過URL訪問它。現在我只想在成功登錄後允許DataService。如何爲EF 5.0代碼添加安全性首先創建一個WCF DataService

+0

您是否使用WCF或MVC作爲您的數據服務的主機? – Kane 2013-03-23 07:23:59

+0

我猜WCF,因爲我沒有使用MVC。 – 2013-03-23 07:30:08

回答

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實現:

 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服務收到的每一個請求,該請求被分派到WCF實現方法之前。