如何从 AppSettings.Json 访问我的 ConnectionString,而不提及 Razor 页面项目中连接字符串的名称?

How can i access my ConnectionString from AppSettings.Json without mentioned the name of the connection string in a Razor page Project?

提问人:DAkers 提问时间:11/3/2023 更新时间:11/3/2023 访问量:40

问:

我正在创建自定义身份验证代码。该项目将被打包并安装在其他“代理项目”中,每个代理机构可能都有自己的连接字符串:agenycOne、agencyTwo 等。

在他们安装此包后,我希望此自定义身份验证代码访问appsettings.json ConnectionString。

我将显示的代码在数据库中检查表 UAM ,它检查用户是否具有 Admin 权限,并基于此他们有权访问某个页面。所以基本上,该软件包将在代理数据库中创建两个表(uam,权利),uam有一个引用权利的entitlmentID。

创建表并填写表后,具有管理员权限的用户有权访问某个页面,但每个机构都有不同的 dbContext 名称,这就是为什么我不想在以下代码中引用 dbContext 名称的原因,因为该机构将无法直接访问此代码进行更改。

我已经阅读并尝试了 Stack 的多种解决方案,但没有一个有助于解决问题,我是 asp.net 核心 Razor 页面的新手,所以我提前道歉。

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.EntityFrameworkCore;
using UAM.Data;

namespace UAM.Extensions
{
    public class AdminEntitlementAttribute : TypeFilterAttribute
    {
        public AdminEntitlementAttribute() : base(typeof(AdminEntitlementFilter))
        {
        }

        private class AdminEntitlementFilter : IAsyncAuthorizationFilter
        {
            private readonly IConfiguration _configuration;
            private readonly IServiceProvider _serviceProvider;

            public AdminEntitlementFilter(IConfiguration configuration, IServiceProvider serviceProvider)
            {
                _configuration = configuration;
                _serviceProvider = serviceProvider;
            }

            public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
            {
                var user = context.HttpContext.User;

                if (user == null)
                {
                    context.Result = new UnauthorizedResult();
                    return;
                }

                if (user.Identity == null || !user.Identity.IsAuthenticated)
                {
                    context.Result = new UnauthorizedResult();
                    return;
                }

                string userID = user.Identity.Name?.Split('\\').Last();

                // Get the connection string from appsettings.json
                string connectionString = _configuration.GetConnectionString("UAMContext");

                // Use the connection string to create UAMContext
                var options = new DbContextOptionsBuilder<UAMContext>()
                    .UseSqlServer(connectionString)
                    .Options;

                using (var dbContext = new UAMContext(options))
                {
                    // Perform your database operations here using dbContext
                    // For example, execute SQL queries or use an ORM like Entity Framework

                    var userInDb = await dbContext.uam
                        .Include(u => u.entitlement)
                        .SingleOrDefaultAsync(u => u.USER_ID == userID);

                    if (userInDb?.entitlement?.EntitlementName != "Admin")
                    {
                        context.Result = new ForbidResult();
                    }
                }
            }
        }
    }
}
sql-server 数据库 身份验证 razor-pages

评论


答: 暂无答案