【问题标题】:Pass connection string to custom AuthorizeAttribute in asp.net core将连接字符串传递给 asp.net 核心中的自定义 AuthorizeAttribute
【发布时间】:2022-03-29 19:19:06
【问题描述】:

我正在将 AuthorizationFilterAttribute 从 asp.net web api 迁移到 asp.net core web api。

KeywordAuthorizationAttribute下面是我的asp.net核心属性代码。

public class KeywordAuthorizationAttribute : AuthorizeAttribute, IAuthorizationFilter 
{

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var user = context.HttpContext.User;

        if (user.Identity.IsAuthenticated)
        {
            SQLDataAccess sqlDataAccess = new SQLDataAccess(**passedConnectionStringFrom_appsettings.json**);
            var username = context.HttpContext.User.Identity.Name.Substring
                    (context.HttpContext.User.Identity.Name.LastIndexOf(@"\") + 1);


            if (!sqlDataAccess.IsUserAllowed((string)context.RouteData.Values["Controller"], username))
            {
                context.Result = new StatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
                return;
            }
        }
        else
        {
            context.Result = new StatusCodeResult((int)System.Net.HttpStatusCode.Unauthorized);
            return;

        }
    }
}

KeywordAuthorizationAttribute 的示例 - 如果控制器或控制器操作使用此 AuthorizeAttribute 进行修饰,它将获取用户名并从数据库检查该控制器的访问权限。

[Authorize]
[HttpGet]
[KeywordAuthorization]
public IActionResult Get()

    return Ok();
}

我的问题是如何将连接字符串传递给KeywordAuthorizationAttribute? 我已经在 appsettings.json 中设置了连接字符串

{
  "ConnectionStrings": {
    "EmployeeDBConnection": "server=(localdb)\\MSSQLLocalDB;database=EmployeeDB;Trusted_Connection=true"
  }
}

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-core


    【解决方案1】:

    使用传递给 OnAuthorization 方法的上下文参数中的 AuthorizationFilterContext.HttpContext.RequestServices.GetService 方法:

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        ...
    
        if (user.Identity.IsAuthenticated)
        {
            var connectionString = context.HttpContext.RequestServices
                .GetService(typeof(IConfiguration))
                .GetConnectionString("EmployeeDBConnection");
            // GetConnectionString is an extension method, so add
            // using Microsoft.Extensions.Configuration
                   
               ...
        }
    }
    

    使用这种技术,您也可以简单地使用您的DbContext

    【讨论】:

    • 这很有效,非常感谢,我只需要再添加一个括号。 ((IConfiguration)context.HttpContext.RequestServices.GetService(typeof(IConfiguration))).GetConnectionString("EmployeeDBConection");您能否也展示一下我如何使用 DbContext?
    【解决方案2】:

    您将需要像在 Startup.cs 中一样使用 Configuration 扩展,并且您可以通过以下方式获取连接字符串:

    Configuration.GetConnectionString("EmployeeDBConnection");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      相关资源
      最近更新 更多