NET核心6:在授权处理程序中使用我的DbContext



我有一个授权处理程序,它需要从数据库中提取数据来完成授权逻辑。这个想法是,用户只允许在发布给定数量的博客文章后进入某些区域。

代码如下:

namespace MyProject.Authorisation
{
public class MinimumPostRequirement : IAuthorizationRequirement
{
public MinimumPostRequirement (int postCount)
{
PostCount = postCount;
}
public int PostCount { get; }
}
public class MinimumPostRequirement Handler : AuthorizationHandler<MinimumPostRequirement >
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext authContext, ApprovedUserRequirement requirement)
{

using (MyDbContext _context = new MyDbContext())
{
int? postCount = _context.Posts.Where(post => post.UserName == authContext.User.Identity.Name).Count();
if(postCount == null)
{
return Task.CompletedTask;
}
if(postCount >= requirement.PostCount)
{
authContext.Succeed(requirement);
}
return Task.CompletedTask;
}

}
}
}

以下是我在Program.cs:中声明的方式

//DB Connection
var connectionString = builder.Configuration.GetConnectionString("MyConnection");
builder.Services.AddDbContext<MyDbContext>(options => options.UseSqlServer(MyConnection));

//authorisation
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("RequireMinimumPosts", policy => policy.Requirements.Add(new MinimumPostRequirement(3)));
});
builder.Services.AddSingleton<IAuthorizationHandler, MinimumPostRequirementHandler>();

我知道添加单例时存在依赖注入问题,所以我也尝试过在Program.cs:中使用

builder.Services.AddScoped<IAuthorizationHandler, MinimumPostRequirementHandler>();

builder.Services.AddTransient<IAuthorizationHandler, MinimumPostRequirementHandler>();

所有这些都会导致以下错误:

InvalidOperationException:尚未为此DbContext配置任何数据库提供程序。可以通过重写"DbContext"来配置提供程序。"OnConfiguring"方法,或在应用程序服务提供程序上使用"AddDbContext"。如果使用了"AddDbContext",请确保您的DbContext类型在其构造函数中接受DbContextOptions对象,并将其传递给DbContext的基构造函数。

该数据库适用于所有其他站点操作。只有当我将[Authorize(Policy = "RequireMinimumPosts")]添加到要限制的方法中时,问题才会出现。

您将如何编写此代码以使其工作?依赖项注入在这种情况下是如何工作的?我缺什么了吗?

DbContext注入到MinimumPostRequirementHandler的构造函数中,以便由DI容器解析。

public class MinimumPostRequirementHandler
: AuthorizationHandler<MinimumPostRequirement>
{
private readonly MyDbContext _dbContext;
public MinimumPostRequirementHandler( MyDbContext dbContext )
{
_dbContext = dbContext;
}
protected override Task HandleRequirementAsync(AuthorizationHandlerContext authContext, ApprovedUserRequirement requirement)
{
// use _dbContext here
}
}

将处理程序注册为作用域。

最新更新