Передайте строку подключения в пользовательский атрибут AuthorizeAttribute в ядре asp. net. - PullRequest
1 голос
/ 31 января 2020

Я мигрирую 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"
  }
}

Ответы [ 2 ]

1 голос
/ 31 января 2020

Используйте метод AuthorizationFilterContext.HttpContext.RequestServices.GetService из аргумента контекста, переданного в ваш метод OnAuthorization:

        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.

0 голосов
/ 31 января 2020

Вам потребуется использовать расширение для конфигурации, как в Startup.cs, и вы можете получить строку подключения с помощью:

Configuration.GetConnectionString("EmployeeDBConnection");
...