提问人:DAkers 提问时间:11/3/2023 更新时间:11/3/2023 访问量:40
如何从 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?
问:
我正在创建自定义身份验证代码。该项目将被打包并安装在其他“代理项目”中,每个代理机构可能都有自己的连接字符串: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();
}
}
}
}
}
}
答: 暂无答案
评论