gpt4 book ai didi

dependency-injection - DotNet Core 中 AuthorizationOptions 要求的依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-04 03:25:46 24 4
gpt4 key购买 nike

我有一个 .NET 核心项目,正在尝试使用 AuthorizationOptions 创建自定义策略,如位于此处的文档中所示:

ASP.NET.Core Authorization - Dependency Injection in requirement handlers

这些示例显示了使用 1 个参数设置授权要求 - 一个简单的 int 值。我的自定义要求需要一个字符串参数以及一个 DbContext 对象。我想在运行时将 DbContext 注入(inject)到需求的构造函数中。我正在使用 Autofac 容器。我不确定如何实现这一点 - 尝试了几种方法,但到目前为止没有任何效果。

这是我的自定义要求:

public UserNameRequirement(string username, MyDbContext context)
{
_userName = username;
_dbContext = context;
}

在 Startup.cs ConfigureServices 方法中设置授权选项时,文档显示您像这样注册:

services.AddAuthorization(options =>
{
options.AddPolicy(
"UserNamePolicy",
policy => policy.Requirements.Add(new UserNameRequirement("admin", ** want to resolve and inject my DbContext here **)));
}

我不确定如何实现这一目标。我看过这篇文章,这是一个类似的问题,但它使用的是 ASP.NET 5,并且该语法不适用于 .net 核心:

Dependency Injection on AuthorizationOptions

最佳答案

好的,我在这里做一个假设,那就是你需要注入(inject)一个 MyDbContext 的实例。在 UserNameRequirement执行业务逻辑。
如果是这种情况,则意味着 UserNameRequirement两者都保存数据 - 在您的情况下是用户名 - 并执行授权逻辑。 ASP.NET Core 中的一个示例是 ClaimsAuthorizationRequirement .
对此的解决方案是将其分为两个类 - 一方面是仅保存与需求相关联的数据的需求,另一方面是授权处理程序。作为说明,即使我们会通过它,我所描述的内容也可以在 official ASP.NET Core docs 中找到。 .
所以需求类可能看起来像:

public class UserNameRequirement : IAuthorizationRequirement
{
public UserNameRequirement(string userName)
{
UserName = userName;
}

public string UserName { get; }
}
处理程序类将是:
public class UserNameRequirementHandler : AuthorizationHandler<UserNameRequirement>
{
private readonly MyDbContext _dbContext;

public UserNameRequirementHandler(MyDbContext dbContext)
{
_dbContext = dbContext;
}

protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, UserNameRequirement requirement)
{
var userName = requirement.UserName;

// Use _dbContext to perform business logic
}
}
接下来也是最后一部分是在容器中注册处理程序:
services.AddSingleton<IAuthorizationHandler, UserNameRequirementHandler>();
这样做的效果是您现在可以将您的要求添加到策略中,而不必担心 DbContext :
services.AddAuthorization(options =>
{
options.AddPolicy(
"UserNamePolicy",
policy => policy.Requirements.Add(new UserNameRequirement("admin")));
}
在内部,ASP.NET 将通过容器解析与该需求相关的所有处理程序,因此 MyDbContext 的实例将在处理程序中为您提供,允许您按照您认为合适的方式执行业务逻辑。
希望我的假设是正确的,这对您有所帮助。
编辑:
Henry Roux 在下面的评论中提出了一个很好的观点,即如果 UserNameRequirementHandler注册为单例,然后是 MyDbContext 的单个实例将被使用,这可能会导致问题。确保使用适当的生命周期注册授权处理程序。

关于dependency-injection - DotNet Core 中 AuthorizationOptions 要求的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42423282/

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