依赖注入 – 对DotNet Core中AuthorizationOptions要求的依赖注
我有一个.NET核心项目,我正在尝试使用AuthorizationOptions创建自定义策略,如下面的文档中所示:
ASP.NET.Core Authorization – Dependency Injection in requirement handlers 这些示例显示了使用1个参数设置授权要求 – 一个简单的int值.我的自定义要求需要字符串参数以及DbContext对象.我想在运行时将DbContext注入需求的构造函数中.我正在使用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
好的,我将在这里做一个假设,那就是你需要在UserNameRequirement中注入一个MyDbContext实例来执行业务逻辑.
如果是这种情况,则意味着UserNameRequirement既保存数据 – 在您的情况下保存用户名 – 并执行授权逻辑. ASP.NET Core中的一个例子是 对此的解决方案是将其分为两类 – 一方面是仅保存与需求相关联的数据的需求,另一方面是授权处理程序.作为一个说明,即使我们将通过它,我所描述的内容可以在official ASP.NET Core docs中找到. 所以需求类看起来像这样: public class UserNameRequirement : IAuthorizationRequirement { public class 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,UserNameRequirementHandler 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的单个实例,这可能会导致问题.确保使用适当的生命周期注册授权处理程序. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |