w2o*_*ves 21 c# .net-core asp.net-core
我有一个有效的 netcore 2.2 项目,我在其中实施了一个检查 API 密钥的自定义策略。
在startup.cs中,我添加了这样的策略
//Add Key Policy
services.AddAuthorization(options =>
{
options.AddPolicy("AppKey", policy => policy.Requirements.Add(new AppKeyRequirement()));
});
Run Code Online (Sandbox Code Playgroud)
在我的 AppKeyRequirement 中,我从 AuthorizationHandler 继承并解析传入请求中的密钥,如下所示
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
Run Code Online (Sandbox Code Playgroud)
这在 netcore 3.1 中不起作用
我收到以下错误:
无法将“Microsoft.AspNetCore.Routing.RouteEndpoint”类型的对象转换为“Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext”类型。
在核心 3 及更高版本中执行此操作的正确方法是什么?
正如 Kirk Larkin 所指出的,.net 3.0 及更高版本中的正确方法是将 IHttpContextAccessor 注入到 Auth 处理程序中并使用它。
我现在的问题是如何注入它?我无法在 startup.cs 中传递它,或者至少我没有看到如何传递。
任何想法/提示将不胜感激。
Kir*_*kin 32
根据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"))
{
// ...
}
}
}
Run Code Online (Sandbox Code Playgroud)
在RouteEndpoint仍然可以使用httpContext.GetEndpoint()。
在 ASP.NET Core 3.0 之前的版本中,IAuthorizationHandler在 MVC 管道期间调用了 的实现。在使用端点路由(默认情况下)的 3.0 之后,这些实现由授权中间件 ( UseAuthorization())调用。这个中间件在MVC 管道之前运行,而不是作为它的一部分。
此更改意味着AuthorizationFilterContext不再传递给授权处理程序。相反,它是 的一个实例RouteEndpoint,它不提供对HttpContext.
在您的示例中,您仅AuthorizationFilterContext用于获取HttpContext. 在 3.0+ 中,注入IHttpContextAccessor您的授权处理程序并使用它。以下是完整性的示例:
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"))
{
// ...
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可能还需要注册IHttpContextAccessor在ConfigureServices:
services.AddHttpContextAccessor();
Run Code Online (Sandbox Code Playgroud)
请参阅使用的HttpContext从自定义组件有关使用的详细信息IHttpContextAccessor。
| 归档时间: |
|
| 查看次数: |
7668 次 |
| 最近记录: |