2015-10-10 19 views
7

ここに示すコードを使用してHMAC認証を実装しようとしています。http://bitoftech.net/2014/12/15/secure-asp-net-web-api-using-api-key-authentication-hmac-authentication/ASP.NET Webフォーム内でASP.NET Web APIを使用しているときに「メソッドが許可されていません」というエラーが表示される

このコードをASP.NET Webフォームアプリケーションに統合しました。私は "HMACAPI"という名前のフォルダを作成し、そこにコントローラとフィルタを追加しました。必要なすべてのNugetパッケージもインストールしました。これは私が私のサービスメソッドを実装しています方法です:

[HMACAuthentication] 
[RoutePrefix("api/forms")] 
public class FormsController : ApiController 
{ 
    [Route("")] 
    public IHttpActionResult Get() 
    { 
     ClaimsPrincipal principal = Request.GetRequestContext().Principal as ClaimsPrincipal; 

     var Name = ClaimsPrincipal.Current.Identity.Name; 

     return Ok("test"); 
    } 

    [Route("")] 
    public IHttpActionResult Post(string order) 
    { 
     return Ok(order); 
    } 
} 

これは、APIのための私のルート設定である:

GlobalConfiguration.Configure(APIWebFormsProject.API.WebApiConfig.Register); 

しかし、私はclient.PostAsJsonAsync()を使用する場合、それはMethod Not Allowedエラーを示しています。私は様々なSOの質問を試みたが、彼らの答えのどれも助けにはならない。私が試した何

  1. WebDAVモジュールを削除しました。

  2. 属性を追加する[HttpPost]属性を追加しました。

私はAPIにアクセスするために "http://localhost:56697/api/forms/" URLを使用しています。でも、私は "http://localhost:56697/api/forms"と "http://localhost:56697/api/forms/test"を試しました。黒曜石フェニックスによって示唆されるように

UPDATE

私は[HMACAuthentication]属性なしでそれを実行することができました。しかし、私はこれをHMAC認証で実装したいと思っています。だから、これの理由は何か?

+0

の代わりに 'GlobalConfiguration.Configuration.Routes.MapHttpRoute'を使う必要があります。' RouteTable.Routes.MapHttpRoute' – MethodMan

+0

@MethodMan私はそれを試みました。まだ動かない。そして、申し訳ありませんが、間違って入力しました。 'Method Not Allowed'エラーです。 –

+0

ちょうどチェック、あなたは 'config.MapHttpAttributeRoutes();'あなたのルート設定の一部としてここでは 'config'はWebApiConfigの 'HttpConfiguration'です – singsuyash

答えて

0

最後に、私はこれを解決しました。私はこれが解決策であるとは思わなかった。 I

はポートがローカルIISサーバーの代わりのVisual Studio開発サーバーを使用し変更しました。私が質問する前にIISを使用していましたが、ポートの変更が問題を解決したと思います。

まあ、私の問題を解決するためのあなたの努力に感謝皆を。すべてのあなたの答えとコメントのために私はこの解決策に出くわしました。 :)

3

HTTP POSTをエンドポイント(api/forms)に送信することに問題があると思いますが、HMACAuth属性とは関係ありません。

このような場合は[文字列として注文を送信されていない、それは文字列プロパティを含むPOCOオブジェクトとしてあるべきに、以下は動作するはずのように何か:

public class OrderModel 
{ 
    public string Order { get; set; } 
} 
+0

これを試して、元のコードも試しました。しかし、どちらの場合も、「タスクがキャンセルされました」というエラーが表示されています。 –

+0

私はHMAC属性のない作業を見つけました。しかし、私は自分のアプリでHMACを使いたいです。私に何ができる? –

3

あなたの上[FromBody]属性が欠落しています方法。

client.PostAsJsonAsync(url, "test")を使用するためには、あなたのメソッドのシグネチャは次のようになります。同様に

[Route("")] 
public IHttpActionResult Post([FromBody] string order) 
{ 
    return Ok(order); 
} 

、POCOオブジェクトを渡した:

[Route("")] 
public IHttpActionResult Post([FromBody] OrderModel order) 
{ 
    return Ok(order); 
} 
+0

私はそれを試しましたが、それでも 'A task was cancelled。 'を返しました。 –

+0

hmac属性を削除してもそれはやっていますか? –

+0

実際にHMAC属性なしで動作します。しかし、私はHMAC認証を使いたいです。 –

関連する問題