【问题标题】:Authorization has been denied when creating ASP.NET Web API with API Key validation使用 API 密钥验证创建 ASP.NET Web API 时授权被拒绝
【发布时间】:2017-02-26 20:54:16
【问题描述】:

我想使用密钥授权我的 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;
        }
    }

有没有办法解决这个问题?我尝试用谷歌搜索,我发现所有结果都不适合我。

【问题讨论】:

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


    【解决方案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 设置为与两者的配置文件相同。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2013-07-23
      • 2012-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      相关资源
      最近更新 更多