2012-02-23 146 views
2

問題保護的WCF 4.0 REST服務:如何發送PUT請求發送到使用OAuth 2.0和DotNetOpenAuth

是否有任何手段(也許是一個解決方法),以支持PUT和DELETE與HTTP動詞使用OAuth 2.0和DotNetOpenAuth 4保護的WCF 4.0 REST服務?我沒有使用WCF Web API或WCF入門套件。

我迄今所做的:

考慮以下WCF 4.0 REST服務:

[ServiceContract] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class MyService 
{ 
    [WebGet(UriTemplate = "")] 
    public List<Resource> GetCollection() 
    { 
     /* some implementation */ 
    } 

    [WebInvoke(UriTemplate = "", Method = "POST")] 
    public Resource Create(Resource instance) 
    { 
     /* some implementation */ 
    } 

    [WebGet(UriTemplate = "{id}")] 
    public Resource Get(string id) 
    { 
     /* some implementation */ 
    } 

    [WebInvoke(UriTemplate = "{id}", Method = "PUT")] 
    public Resource Update(string id, Resource instance) 
    { 
     /* some implementation */ 
    } 

    [WebInvoke(UriTemplate = "{id}", Method = "DELETE")] 
    public void Delete(string id) 
    { 
     /* some implementation */ 
    } 
} 

的OAuth 2.0用於控制對服務的訪問。它通過使用DotNetOpenAuth的自定義ServiceAuthorizationManager實現來完成所有工作。該實現與DotNetOpenAuth 4.0示例提供的實現幾乎完全相同。

對於POST和GET請求它很好。然而,請求失敗的PUT和DELETE與錯誤信息的請求:

'AccessProtectedResourceRequest' messages cannot be received with HTTP verb 'PutRequest' 

客戶端代碼看起來類似於:

public class ResourceClient 
{ 
    public Resource UpdateResource(Resource resource) 
    { 
     var uri = new Uri(new Uri("http://api.example.com/"), Resource.Format("resources/{0}", resource.Id)); 
     var serializer = new DataContractSerializer(typeof(Resource)); 
     var request = (HttpWebRequest)WebRequest.Create(uri); 
     request.Method = "PUT"; 
     request.ContentType = "application/xml"; 
     ClientBase.AuthorizeRequest(request, Authorization.AccessToken); 

     using (var requestStream = request.GetRequestStream()) 
     { 
      serializer.WriteObject(requestStream, resource); 
     } 

     using (var response = (HttpWebResponse)request.GetResponse()) 
     { 
      using (var responseStream = response.GetResponseStream()) 
      { 
       Debug.Assert(responseStream != null, "responseStream != null"); 
       return (Resource)serializer.ReadObject(responseStream); 
      } 
     } 
    } 
} 

another question答案似乎這是可能DotNetOpenAuth中的一個缺陷。查看OAuth 2.0規範,我沒有看到禁止在訪問資源時使用PUT或DELETE http動詞的任何內容。也就是說,我不是OAuth 2.0的專家,也不是我的心。

所以我認爲我會「聰明」,並使用「X-HTTP-Method-Override」指定PUT,然後將請求發佈到資源服務器。我按照this sample中的解釋執行了該行爲。有趣的是,自定義行爲在我的ServiceAuthorizationManager實現之前被調用,導致了完全相同的錯誤。

另一種方法是解決DotNetOpenAuth本身的問題,但我不知道從哪裏開始。

我用盡了想法,我會很感激任何建議。

回答

0

這個跟蹤Issue #62。如果您希望將其移植到您的版本而無需等待下一個版本發佈,您可以瀏覽該修補程序。

+0

下一個發佈計劃何時計劃? – bloudraak 2012-02-24 07:00:23

+0

您可以在這裏查看各種功能發佈計劃的最佳預測日期:https://github.com/AArnott/dotnetopenid/issues/milestones – 2012-02-24 14:11:11