13

私の API クライアント コードは、次のようなクエリ文字列で認証トークンを送信します。

www.example.com/api/user/get/123?auth_token=ABC123

私は Mvc Web API コントローラーを使用しており、auth_token が有効かどうかをチェックするフィルターを持っていますが、リクエストのクエリ文字列値にアクセスする方法がわかりません。

これは私が今やっていることですが、明らかに間違っています:

以下のスニペットは、次から継承するフィルターの内部にあります。

ActionFilterAttribute

public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
       base.OnActionExecuting(actionContext);

       if (actionContext.Request.Properties.ContainsKey("auth_token") &&
          actionContext.Request.Properties["auth_token"].ToString() == "ABC123")
       {
         ...
       }
}
4

3 に答える 3

30

次のように、GetQueryNameValuePairs 拡張メソッドを使用します。

var queryString = actionContext.Request.GetQueryNameValuePairs().ToDictionary(x => x.Key, x => x.Value);

編集 キーの重複を避けるために、次のことを検討してToLookupください。

var queryString = actionContext.Request.GetQueryNameValuePairs().ToLookup(x => x.Key, x => x.Value);

ルックアップに関するブログ投稿は次のとおりです: https://www.c-sharpcorner.com/UploadFile/vendettamit/using-lookup-for-duplicate-key-value-pairs-dictionary/

于 2013-09-26T01:14:33.977 に答える
10

フィルターのOnActionExecutingメソッドでは、クエリ文字列にアクセスし、このように解析してトークンを取得できます。

var queryString = actionContext.Request.RequestUri.Query;
if(!String.IsNullOrWhiteSpace(queryString))
{
    string token = HttpUtility.ParseQueryString(
                         queryString.Substring(1))["auth_token"];
}

しかし、クエリ文字列でトークンを渡すことは良い習慣ですか? おそらくそうではありませんが、それはあなた次第です。クエリ文字列がログに記録されてキャッシュされる可能性があるため、HTTP ヘッダーの方が適切なオプションになる可能性があります。

于 2013-09-24T16:51:13.363 に答える