C# 读取netcore api 3.1中的AuthorizationFilterContext
我有一个正在工作的netcore 2.2项目,在该项目中我实现了一个检查API密钥的自定义策略 在startup.cs中,我添加了如下策略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
//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
的更多信息,请参阅。回答得很好,感谢您的深入了解!