我想用密钥授权我的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;
}
}
有什么方法可以解决这个问题吗?我试着去谷歌,我发现的所有结果都不适合我。
答案 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
设置为两者的配置文件相同。
按照以下网址中的说明匹配应用程序之间的设置,您应该没问题: