gpt4 book ai didi

c# - 读取net core api 3.1中的AuthorizationFilterContext

转载 作者:行者123 更新时间:2023-12-02 03:34:05 32 4
gpt4 key购买 nike

我有一个正在运行的 netcore 2.2 项目,我在其中实现了检查 API key 的自定义策略。

在startup.cs中,我添加了这样的策略

//Add Key Policy
services.AddAuthorization(options =>
{
options.AddPolicy("AppKey", policy => policy.Requirements.Add(new AppKeyRequirement()));
});

在我的 AppKeyRequirement 中,我继承了 AuthorizationHandler 并像这样解析传入请求中的 key

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 中不起作用

我收到以下错误:

Unable to cast object of type 'Microsoft.AspNetCore.Routing.RouteEndpoint' to type 'Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext'.

在核心 3 及以上版本中执行此操作的正确方法是什么?

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

我现在的问题是如何注入(inject)它?我无法在startup.cs中传递这个,或者至少我不知道如何传递。

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

最佳答案

ASP.NET Core 5+

基于announcement对于 ASP.NET Core 5.0-preview7 及以上版本,Resource 属性设置为请求的当前 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"))
{
// ...
}
}
}

使用httpContext.GetEndpoint()RouteEndpoint仍然可用。

ASP.NET Core 3.x

在 ASP.NET Core 3.0 之前的版本中,在 MVC 管道期间调用 IAuthorizationHandler 的实现。从 3.0 开始,使用端点路由(默认情况下),这些实现由授权中间件 (UseAuthorization()) 调用。该中间件在 MVC 管道之前运行,而不是作为其中的一部分运行。

此更改意味着 AuthorizationFilterContext 不再传递给授权处理程序。相反,它是 RouteEndpoint 的一个实例,它不提供对 HttpContext 的访问。

在您的示例中,您仅使用 AuthorizationFilterContext 来获取 HttpContext。在 3.0+ 中,将 IHttpContextAccessor 注入(inject)您的授权处理程序并使用它。下面是一个完整性示例:

public class AppKeyAuthorizationHandler : AuthorizationHandler<AppKeyRequirement>
{
private readonly IHttpContextAccessor httpContextAccessor;

public AppKeyAuthorizationHandler(IHttpContextAccessor httpContextAccessor)
{
this.httpContextAccessor = httpContextAccessor;
}

protected override Task HandleRequirementAsync(
AuthorizationHandlerContext authContext, AppKeyRequirement requirement)
{
var httpContext = httpContextAccessor.HttpContext;
var query = httpContext.Request.Query;

if (query.ContainsKey("key") && query.ContainsKey("app"))
{
// ...
}
}
}

您可能还需要在 ConfigureServices 中注册 IHttpContextAccessor:

services.AddHttpContextAccessor();

参见Use HttpContext from custom components有关使用 IHttpContextAccessor 的更多信息。

关于c# - 读取net core api 3.1中的AuthorizationFilterContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58565574/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com