2012-02-23 8 views
2

質問:どのようにOAuth 2.0で保護されているWCF 4.0 RESTサービスにPUTリクエストを送信し、DotNetOpenAuth

はPUTをサポートしてHTTP動詞を削除するには、任意の手段(おそらく回避策が)ありますOAuth 2.0とDotNetOpenAuth 4を使用してセキュリティ保護されたWCF 4.0 RESTサービス?私はWCF Web APIまたはWCF Starter Kitを使用していません。私がこれまで行ってきた何

は、次の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' 

クライアントコードはと同様になります。これがあるがあり得ることを思わanother questionの答えから

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); 
      } 
     } 
    } 
} 

DotNetOpenAuthの欠落OAuth 2.0仕様を見ると、リソースにアクセスするときにPUTまたはDELETE http動詞の使用を禁止するものは何も表示されません。つまり、私はOAuth 2.0の専門家ではなく、心に留めているわけでもありません。

私は "賢い"と思って、 "X-HTTP-Method-Override"を使ってPUTを指定し、リソースサーバーに要求をPOSTします。私はthis sampleで説明されているような振る舞いを実装しました。興味深いことに、ServiceAuthorizationManagerの実装前にカスタムビヘイビアが呼び出されたため、まったく同じエラーが発生しました。

DotNetOpenAuth自体の問題に対処する方法もありますが、どこから開始するのかはわかりません。

私はアイデアが不足しているので、私は何か提案をいただきたいと思います。

答えて

0

これはIssue #62によって追跡されます。次回のリリースを待つことなく、あなたのバージョンに移植したい場合は、修正プログラムを見ることができます。

+0

次回のリリースはいつ予定されていますか? – bloudraak

+0

さまざまな機能のリリーススケジュールの予測日は、ここをクリックしてください:https://github.com/AArnott/dotnetopenid/issues/milestones –

関連する問題