使用API​​密钥验证创建ASP.NET Web API时,授权被拒绝

时间:2016-10-17 19:00:16

标签: c# asp.net-web-api asp.net-mvc-5

我想用密钥授权我的web api,但它总是说"此请求已拒绝授权。"以下是我尝试的最后一个代码。

这是委托处理程序类:

// Message Handler class
public class APIKeyFilter: DelegatingHandler
    {
        // Default API Key
        private const string APIKEY = "b018a9c5105d427127e";
        protected override Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage request, CancellationToken cancellationToken)
        {
            var query = request.RequestUri.ParseQueryString();
            string key = query["key"];
            if (APIKEY!=key)
            {
                var response = new HttpResponseMessage(HttpStatusCode.Forbidden);
                var tsc = new TaskCompletionSource<HttpResponseMessage>();
                tsc.SetResult(response);
                return tsc.Task;
            }
            return base.SendAsync(request, cancellationToken);
        }


    }

这是全球类:

public class Global : HttpApplication
    {
        void Application_Start(object sender, EventArgs e)
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            GlobalConfiguration.Configuration.MessageHandlers.Add(new Filter.APIKeyFilter());
        }
    }

这是我的api控制器:

    [Authorize]
    public class CategoriesController : ApiController
    {
        private WebAPI2Context db = new WebAPI2Context();

        // GET: api/Categories
        public IQueryable<Category> GetCategories()
        {
            return db.Categories;
        }
    }

有什么方法可以解决这个问题吗?我试着去谷歌,我发现的所有结果都不适合我。

1 个答案:

答案 0 :(得分:1)

虽然不要将过滤器与处理程序混淆,但没有太明显的错误。

可能是您尝试从另一个进程中运行的网站,在另一个端口上调用Web API控制器。可能由下面可能的问题1,2或两者引起。

可能原因1

也许这是一个CORS问题。没有更多来自回复的信息很难说出来。尝试将此添加到您的全局:

var cors = new EnableCorsAttribute("*", "*", "*");
GlobalConfiguration.Configuration.EnableCors(cors);

对于预打击检查,我会在您自定义处理程序中的If下添加以下内容:

if (request.Headers.Contains("Origin") && request.Method.Method == "OPTIONS")
            {
                var response = new HttpResponseMessage();
                response.StatusCode = HttpStatusCode.OK;
                response.Headers.Add("Access-Control-Allow-Origin", "*");
                response.Headers.Add("Access-Control-Allow-Headers", "Origin, Content-Type, Accept, Authorization");
                //Worked before for deletes but CORS came back out of blue for deletes so changed * for DELETE and content doing al CRUD at the moment..
                response.Headers.Add("Access-Control-Allow-Methods", "DELETE, POST, PUT, OPTIONS, GET");
            }

如果是这样你就需要安装NuGet:Microsoft.AspNet.WebApi.Cors

可能的原因2

您还需要确保machineKey设置为两者的配置文件相同。

按照以下网址中的说明匹配应用程序之间的设置,您应该没问题:

https://msdn.microsoft.com/en-us/library/eb0zx8fc.aspx