无法使用 DI 登录 AuthorizationFilter

Cav*_*man 1 c# dependency-injection nlog .net-core asp.net-core-webapi

我仍然没有\xe2\x80\x99t 依赖注入,并且我\xe2\x80\x99m 是新的.Net Core(使用3.1.5)。我\xe2\x80\x99已经为WebAPI创建了一个AuthorizationFilter。我\xe2\x80\x99m 仍然不明白的是如何将我的 Nlog 传递给属性。

\n

我有以下内容作为我的 AuthorizaitonFilter

\n
public class TokenAttribute : Attribute, IAuthorizationFilter\n    {\n        private readonly ILogger _logger;\n\n        public TokenAttribute(ILogger logger)\n        {\n            _logger = logger;\n        }\n\n        public void OnAuthorization(AuthorizationFilterContext context)\n        {\n            _logger.LogInformation("Authorizing");\n\n            //Get the values from the Request Header\n            context.HttpContext.Request.Headers.TryGetValue("Api-Token", out var token);\n            context.HttpContext.Request.Headers.TryGetValue("Customer", out var customer);\n\n            //Query to look up Customer and Token\n\n            using (var ctx = new ModelContext())\n            {\n                var results = ctx.Token.FromSqlRaw(sbQuery.ToString()).ToList();\n\n                if (results == null || results.Count == 0)\n                {\n                    context.Result = new BadRequestObjectResult("Invalid Token");\n                    return;\n                }\n\n                return;                \n            }\n        } \n    }        \n}\n
Run Code Online (Sandbox Code Playgroud)\n

但是,我\xe2\x80\x99m 在我的令牌属性上收到错误。如果我保留它,[Token]我会抱怨一条消息:\xe2\x80\x9cThere is no argument given that corresponds to the required formal parameter\xe2\x80\x9d。我明白这一点是因为 Token attribute\xe2\x80\x99s 构造函数正在寻找 ILogger。

\n
[Token]\n        [AcceptVerbs(WebRequestMethods.Http.Get, WebRequestMethods.Http.Post)]\n        public ShiftRequest Post([FromBody] ShiftRequest m)\n        {\n            _logger.LogInformation("Calling POST command.");\n
Run Code Online (Sandbox Code Playgroud)\n

然后,如果我尝试将 _logger 传递给令牌属性,它会抱怨\xe2\x80\x9cAn object reference is required for the non-static field \xe2\x80\x98ShiftController._logger\xe2\x80\x99\xe2\x80\x9d.

\n
[ApiController]\n[Route("[controller]")]\npublic class ShiftController : ControllerBase\n{\n    private IConfiguration _config;\n    private readonly ILogger<ShiftController> _logger;\n\n    public ShiftController(ILogger<ShiftController> logger, IConfiguration config)\n    {\n        _config = config;\n        _logger = logger;\n    }\n        \n    [Token(_logger)]\n    [AcceptVerbs(WebRequestMethods.Http.Get, WebRequestMethods.Http.Post)]\n    public ShiftRequest Post([FromBody] ShiftRequest m)\n    {\n        _logger.LogInformation("Calling POST command.");\n
Run Code Online (Sandbox Code Playgroud)\n

更新的代码

\n
public class TokenAuthorizationFilter : IAuthorizationFilter\n    {\n        private readonly ILogger<TokenAuthorizationFilter> _logger;\n        public TokenAuthorizationFilter(ILogger<TokenAuthorizationFilter> logger)\n        {\n            _logger = logger;\n        }\n\n        public void OnAuthorization(AuthorizationFilterContext context)\n        {\n            _logger.LogInformation("Authorizing Token");\n\n            //Get the values from the Request Header\n            context.HttpContext.Request.Headers.TryGetValue("Api-Token", out var token);\n            context.HttpContext.Request.Headers.TryGetValue("Customer", out var customer);\n\n\n//Query to check username and password\n\n            using (var ctx = new ModelContext())\n            {\n                var results = ctx.Token.FromSqlRaw(sbQuery.ToString()).ToList();\n\n                if (results == null || results.Count == 0)\n                {\n                    context.Result = new BadRequestObjectResult("Invalid Token");\n                    return;\n                }\n\n                if (!context.ModelState.IsValid)\n                {\n                    context.Result = new BadRequestObjectResult(context.ModelState);\n                }\n\n                return;\n            }\n        }\n
Run Code Online (Sandbox Code Playgroud)\n

启动.cs

\n
public void ConfigureServices(IServiceCollection services)\n        {\n            services.AddScoped<TokenAuthorizationFilter>();\n            services.AddControllersWithViews();\n        }\n
Run Code Online (Sandbox Code Playgroud)\n

控制器

\n
 [ServiceFilter(typeof(TokenAuthorizationFilter))]\n        [AcceptVerbs(WebRequestMethods.Http.Get, WebRequestMethods.Http.Post)]\n        public ShiftRequest Post([FromBody] ShiftRequest m)\n        {\n            _logger.LogInformation("Calling POST command.");\n
Run Code Online (Sandbox Code Playgroud)\n

Ben*_*ica 5

在这种情况下,您不需要子类化Attribute[ServiceFilter(type)]对于授权过滤器,可以通过操作的属性添加这些过滤器。ServiceFilter使用该属性时,所有依赖项都会通过 ASP.NET Core 的内置服务提供程序自动注入。

在您的代码中,这看起来像[ServiceFilter(typeof(TokenAttribute))],尽管作为个人建议,将其命名为 类似 可能更合适TokenAuthorizationFilter

请注意,您必须在HTTP 管道设置TokenAttribute内部或任何地方将您的服务注册为服务。Startup.cs