Как настроить Ocelot с утверждениями (ролями)?

Я пытаюсь настроить Ocelot на шлюзе Api, но не могу выполнить авторизацию. Мне удалось настроить заявки, и я могу авторизовать их внутри своих контроллеров. Я добавляю претензию к пользователю примерно так:

await userManager.AddClaimAsync(user, new Claim(ClaimTypes.Role, configuration["InitialAdmin:Role"]));

Затем я настраиваю Ocelot со следующей конфигурацией:

{
  "ReRoutes": [
    {
      "DownstreamPathTemplate": "/api/home/user",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 5001
        }
      ],
      "UpstreamPathTemplate": "/api/home/user",
      "RouteClaimsRequirement": {
          "Role": "user"
      }
    },
    {
      "DownstreamPathTemplate": "/api/home/admin",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 5001
        }
      ],
      "UpstreamPathTemplate": "/api/home/admin",
      "RouteClaimsRequirement": {
        "Role": "SuperAdmin"
      }
    }
  ],
  "GlobalConfiguration": {
    "BaseUrl": "https://localhost:5000"
  }
}

Вот мой метод ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddIdentity<CondatoUser, IdentityRole>(options =>
    {
        //Signin config
        options.SignIn.RequireConfirmedEmail = true;

        //Password config
        options.Password.RequiredLength = 8;
        options.Password.RequireNonAlphanumeric = false;
        options.Password.RequireLowercase = false;
        options.Password.RequireUppercase = false;

        //User config
        options.User.RequireUniqueEmail = true;
    })
    .AddDefaultUI()
    .AddEntityFrameworkStores<UserManagementDbContext>();
           services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    services.AddOcelot(Configuration);
}

Затем я вхожу в этот шлюз Api (это проект MVC с пользовательским интерфейсом по умолчанию для входа / регистрации и т. Д.) И пытаюсь перейти по следующему URL-адресу:

https://localhost:5000/api/home/admin

Однако мне всегда возвращается статус 403. Когда удаляю RouteClaimsRequirement, работает. Думаю, мне чего-то не хватает, но я понятия не имею, как документация для RouteClaimsRequirement немного скудна.

Кто-нибудь может мне здесь помочь? Спасибо.


person LeonidasFett    schedule 26.04.2019    source источник
comment
Удалось ли вам в этом разобраться? У меня точно такая же проблема.   -  person Marcus W    schedule 02.07.2019
comment
Нет, но мне удалось запустить и запустить службы управления API Azure. Мы размещаем наше приложение исключительно в Azure, поэтому интеграция работает очень хорошо.   -  person LeonidasFett    schedule 02.07.2019
comment
Хорошо спасибо. Я отправил ответ (ниже), который, как мне кажется, хорошо отвечает на это. Не стесняйтесь отмечать как правильные;) Ура!   -  person Marcus W    schedule 03.07.2019


Ответы (1)


Оказывается, этого нельзя сделать с помощью предопределенного ClaimTypes в System.Security.Claims. Это связано с тем, что парсинг json настроек (app) не может обрабатывать двоеточие (:) в ключе словаря. Ссылаясь на эту проблему в репозитории Ocelot.

Решение состоит в том, чтобы использовать настраиваемый тип заявки, например "Role" вместо System.Security.Claims.Role, что дает "http://schemas.microsoft.com/ws/2008/06/identity/claims/role "

person Marcus W    schedule 02.07.2019