如何在ASP.NET Core中的ActionFilterAttribute中访问AppSettings

7

我目前正在尝试开发一个 WebAPI (.NET Core),其中一些控制器操作应该使用 HTTP Basic Authentication 。为了实现这一点,我编写了一个 ActionFilterAttribute ,然后可以在我的控制器中使用它来限制对某些操作的访问。如果我像下面这样做,那么一切都很好:

BasicAuthAttribute.cs

public class BasicAuthAttribute : ActionFilterAttribute{
    private string _username { get; set; }
    private string _password { get; set; }

    public BasicAuthAttribute(string username, string password) {
        _username = username;
        _password = password;
    }

    public override void OnActionExecuting(ActionExecutingContext actionContext) {
    //do Auth check...
    }
}

在控制器中,我会按照以下方式使用它:

SomeController.cs

[BasicAuth("testuser","testpassword")]
[HttpGet("{id}")]
public IActionResult Get(string id) {
    return new ObjectResult("Test");
}

现在我不想在SomeController.cs中指定用户名和密码。相反,我想将它们存储在appsettings.json中。如何在ActionFilterAttribute的OnActionExecuting方法中访问存储在appsettings.json中的值?
如果我将BasicAuthAttribute的构造函数更改为以下内容,则.Net会期望我传递设置,这是不可能的。依赖注入似乎在这里无法工作。
public BasicAuthAttribute(IOptions<AppSettings> appSettings) {}

任何帮助或想法都将不胜感激。
根据Set的答案更新:
我最终将属性更改为过滤器。 如果其他人需要,可以查看下面的工作解决方案:
BasicAuthFilter.cs
public class BasicAuthFilter : IActionFilter {

    protected AppSettings _settings { get; set; }

    public BasicAuthAttribute(IOptions<AppSettings> appSettings) {
        _settings = appSettings;
    }

    public void OnActionExecuted(ActionExecutedContext context) {
        //nothing to do here
    }

    public override void OnActionExecuting(ActionExecutingContext actionContext) 
    {
        //do Auth check...
    }
}

SomeController.cs

public class SomeController : Controller {
   [TypeFilter(typeof(BasicAuthFilter))]
   [HttpGet("{id}")]
   public IActionResult Get(string id) {
        return new ObjectResult("Test");
   }
}   
1个回答

3

ASP.NET Core documentation中的Filters部分解释了如何使用DI:

如果您的过滤器具有需要从DI访问的依赖项,则有几种支持的方法。您可以使用以下方法之一将您的过滤器应用于类或操作方法:

  • ServiceFilterAttribute
  • TypeFilterAttribute
  • 在您的属性上实现IFilterFactory

这是直接链接到此处引用的 DI 部分:https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-2.2#dependency-injection - steven87vt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接