C# 读取netcore api 3.1中的AuthorizationFilterContext

C# 读取netcore api 3.1中的AuthorizationFilterContext,c#,asp.net-core,.net-core,C#,Asp.net Core,.net Core,我有一个正在工作的netcore 2.2项目,在该项目中我实现了一个检查API密钥的自定义策略 在startup.cs中,我添加了如下策略 //Add Key Policy services.AddAuthorization(options => { options.AddPolicy("AppKey", policy => policy.Requirements.Add(new AppKeyRequirement())); }); protected override T

我有一个正在工作的netcore 2.2项目,在该项目中我实现了一个检查API密钥的自定义策略

在startup.cs中,我添加了如下策略

//Add Key Policy
services.AddAuthorization(options =>
{
    options.AddPolicy("AppKey", policy => policy.Requirements.Add(new AppKeyRequirement()));
});
protected override Task HandleRequirementAsync(AuthorizationHandlerContext authContext, AppKeyRequirement requirement)
{
    var authorizationFilterContext = (AuthorizationFilterContext)authContext.Resource;
    var query = authorizationFilterContext.HttpContext.Request.Query;

    if (query.ContainsKey("key") && query.ContainsKey("app"))
    { // Do stuff
在AppKeyRequirement中,我从AuthorizationHandler继承并解析传入请求中的密钥,如下所示

//Add Key Policy
services.AddAuthorization(options =>
{
    options.AddPolicy("AppKey", policy => policy.Requirements.Add(new AppKeyRequirement()));
});
protected override Task HandleRequirementAsync(AuthorizationHandlerContext authContext, AppKeyRequirement requirement)
{
    var authorizationFilterContext = (AuthorizationFilterContext)authContext.Resource;
    var query = authorizationFilterContext.HttpContext.Request.Query;

    if (query.ContainsKey("key") && query.ContainsKey("app"))
    { // Do stuff
这在netcore 3.1中不起作用

我得到以下错误:

无法将类型为“Microsoft.AspNetCore.Routing.RouteEndpoint”的对象强制转换为类型为“Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext”

在core 3及以上版本中,正确的方法是什么

正如Kirk Larkin所指出的,在.net 3.0及更高版本中,正确的方法是将IHttpContextAccessor注入Auth处理程序并使用它

我现在的问题是如何注入这个?我无法通过startup.cs,或者至少我不知道如何通过

任何想法/提示都将不胜感激。

ASP.NET Core 5.x 基于ASP.NET Core 5.0-preview7之后的版本,将
资源
属性设置为请求的当前
HttpContext
(使用端点路由时)。这意味着以下示例将适用于ASP.NET Core 5.0以后的版本,而不需要
IHttpContextAccessor

public class AppKeyAuthorizationHandler : AuthorizationHandler<AppKeyRequirement>
{
    protected override Task HandleRequirementAsync(
        AuthorizationHandlerContext authContext, AppKeyRequirement requirement)
    {
        var httpContext = authContext.Resource as HttpContext;
        var query = httpContext.Request.Query;

        if (query.ContainsKey("key") && query.ContainsKey("app"))
        {
            // ...
        }
    }
}
您可能还需要在
ConfigureServices
中注册
IHttpContextAccessor

services.AddHttpContextAccessor();

有关使用
IHttpContextAccessor

的更多信息,请参阅。回答得很好,感谢您的深入了解!