質問:どのように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自体の問題に対処する方法もありますが、どこから開始するのかはわかりません。
私はアイデアが不足しているので、私は何か提案をいただきたいと思います。
次回のリリースはいつ予定されていますか? – bloudraak
さまざまな機能のリリーススケジュールの予測日は、ここをクリックしてください:https://github.com/AArnott/dotnetopenid/issues/milestones –