Как получить доступ к параметрам appsetting.json в классе AuthorizeAttribute в .Net Core

В моем приложении ASP.NET Core MVC у меня есть класс, который наследуется от AuthorizeAttribute и реализует IAuthorizationFilter.

namespace MyProject.Attributes
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
    public class AllowGroupsAttribute : AuthorizeAttribute, IAuthorizationFilter
    {
        private readonly List<PermissionGroups> groupList = null;
        public AllowGroupsAttribute(params PermissionGroups[] groups)
        {
            groupList = groups.ToList();
        }

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

            //If the user is not authenticated then prevent execution
            if (!executingUser.Identity.IsAuthenticated)
            {
                context.Result = new StatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
            }
        }
    }
}

Это позволяет мне украсить метод контроллера чем-то вроде [AllowGroups(PermissionGroups.Admin, PermissionGroups.Level1]

Я планирую получить имена групп из appsettings.json на основе перечисленных значений перечисления и проверить, является ли пользователь членом этих групп.

Мой вопрос: как правильно получить доступ к настройкам приложения из моего класса атрибутов?


person GarethPN    schedule 24.10.2018    source источник
comment
настроить параметры при запуске с помощью параметров или конкретной объектной модели, а затем разрешить их с помощью HttpContext.RequestServices   -  person Nkosi    schedule 24.10.2018


Ответы (1)


Настроить параметры при запуске,

Либо через параметры

services.Configure<MySettings>(Configuration.GetSection("groups"));

Или конкретная объектная модель

MySettings settings = Configuration.GetSection("groups").Get<MySettings>();
services.AddSingleton(settings);

И затем разрешите их через HttpContext.RequestServices в фильтре

//...

IServiceProvider services = context.HttpContext.RequestServices;

MySettings settings = services.GetService<MySettings>();
//-- OR --
//MySettings settings = services.GetService<IOptions<MySettings>>().Value;

//...

в то время как подход, основанный на поиске сервисов, должен обеспечивать доступ к желаемой конфигурации.

person Nkosi    schedule 24.10.2018
comment
Спасибо. Я думаю, что сейчас я немного ближе к реализации этого, я реализовал класс со словарем, чтобы вытащить раздел из настроек, никаких ошибок там нет. Но у меня ошибка сборки в строке var settings = services.GetService<MySettings>();. Ошибка: CS0308 Неуниверсальный метод IServiceProvider.GetService (Type) не может использоваться с аргументами типа - person GarethPN; 24.10.2018
comment
@GarethPN GetSrvice<T> - это метод расширения. Скорее всего, вам не хватает пространства имен using для внедрения зависимостей. - person Nkosi; 24.10.2018
comment
Ага! Я добавил using Microsoft.Extensions.DependencyInjection;, чтобы получить доступ к универсальному методу, который разрешил мою ошибку. Спасибо за помощь :) - person GarethPN; 24.10.2018