代码之家  ›  专栏  ›  技术社区  ›  Ritmo2k

使用数据库访问实现自定义IAuthorizationPolicyProvider

  •  0
  • Ritmo2k  · 技术社区  · 6 年前

    我使用的是ASP.NET核心2.1,我有一个 IAuthorizationPolicyProvider 对数据库上下文使用ctor注入。由于提供程序必须注册为singleton,因此在数据库上下文的作用域内引发。

    因此,我将连接字符串设置对象插入ctor中,然后使用选项生成器并在调用中创建上下文 GetPolicyAsync :

    var optionsBuilder = new DbContextOptionsBuilder<MyContext>();
    optionsBuilder.UseSqlServer(this.connectionStrings.MyContextConnection);
    
    using (var context = new MyContext(optionsBuilder.Options))
    {
        // ...
    }
    

    用例在 documentation ,是否有一种更安全、更有效的方法来获取方法调用中的上下文?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Edward    6 年前

    重新定向 scoped service singleton service ,您可以尝试注册 IServiceProvider 在单人服务。

    public class DbPolicyProvider : IAuthorizationPolicyProvider
    {
        private readonly IServiceProvider _serviceProvider;
        public DbPolicyProvider(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }
        public async Task<AuthorizationPolicy> GetDefaultPolicyAsync()
        {
            return await GetPolicyAsync("DbPolicy");
        }
    
        public Task<AuthorizationPolicy> GetPolicyAsync(string policyName)
        {
            using (var db = _serviceProvider.CreateScope().ServiceProvider.GetRequiredService<ApplicationDbContext>())
            {
                var policys = db.Policys.Where(p => p.Name == policyName).ToList();
                var build = new AuthorizationPolicyBuilder();
                foreach (var policy in policys)
                {
                    build.RequireClaim(policyName, policy.Config);
                }
                return Task.FromResult(build.Build());
            }
        }
    }