1

これらのルートを登録するだけで、WebApiKeyHandler.cs で Apikey 値を取得できます。これはクエリ文字列の一部ではないため、null を取得しています。また、キーを検証する方法が Web Api プロジェクトのベスト プラクティスであることを教えてください。

public static void Register(HttpConfiguration config)
        {
           config.Routes.MapHttpRoute(
           name: "DefaultApi2",
           routeTemplate: "api/v1/users/{apikey}/{controller}/{action}/",
           defaults: new { id = RouteParameter.Optional }
                );

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/v1/users/{apikey}/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            config.MessageHandlers.Add(new WebApiKeyHandler());  // global message handler
        }

WebApiKeyHandler.cs

   public class WebApiKeyHandler : DelegatingHandler
    {
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            string apikey = HttpUtility.ParseQueryString(request.RequestUri.Query).Get(Constants.API_KEY_QUERY_STRING);
            if (string.IsNullOrWhiteSpace(apikey))
            {
                HttpResponseMessage response = request.CreateErrorResponse(HttpStatusCode.Forbidden, ErrorCodes.API_KEY_EMPTY_ERROR);
                var tsc = new TaskCompletionSource<HttpResponseMessage>();
                tsc.SetResult(response);
                return tsc.Task;
            }
            else if (!ValidateKey(apikey))
            {
                HttpResponseMessage response = request.CreateErrorResponse(HttpStatusCode.Forbidden, ErrorCodes.API_KEY_INVALID_ERROR);
                var tsc = new TaskCompletionSource<HttpResponseMessage>();
                tsc.SetResult(response);
                return tsc.Task;
            }
            else
            {
                return base.SendAsync(request, cancellationToken);
            }
        }

        private static bool ValidateKey(string apiKey)
        {
            Guid key;
            Guid.TryParse(apiKey, out key);
            return new StAccountsDomainContext().ApiSubscriptions.Any(x => x.ApiKey == key && x.IsActive == true && !x.ApiIBlacklists.Any());
        }

        private static bool ValidateSecretKey(string apiKey, string secretKey)
        {
            Guid key1;
            Guid.TryParse(apiKey, out key1);

            Guid key2;
            Guid.TryParse(secretKey, out key2);

            return new StAccountsDomainContext().ApiSubscriptions.Any(x => x.ApiKey == key1
                                                                        && x.SecretKey == key2
                                                                        && x.IsActive == true
                                                                        && !x.ApiIBlacklists.Any());
        }
    }
4

1 に答える 1

1

GetRouteData()HttpRequestMessageの拡張機能を使用して、ルート データを取得できます。例:request.GetRouteData().Values

于 2013-06-07T01:58:22.170 に答える