Временно скрыть недавно выпущенное приложение для пользователей в PROD - PullRequest
0 голосов
/ 07 февраля 2019

Мы используем единый вход для аутентификации наших пользователей.Теперь мы выпустили новое приложение только для пилотов-тестировщиков в нашей производственной среде, которая также использует SSO.Проблема в том, что если другие пользователи знают, что URL-адрес может войти в новое приложение, если они уже вошли в одно из наших приложений.

Как мы решаем это, чтобы только пилот-тестеры могли войти в приложение?

1 Ответ

0 голосов
/ 09 февраля 2019

Что вы должны сделать - это замкнуть конвейер, когда недопустимый или неизвестный пользователь хочет получить доступ к приложению.Вы можете сделать это с помощью middleware или добавив фильтр к компоненту авторизации.

Самый простой способ - использовать для этого авторизация на основе утверждений .Вам нужно только добавить политику, которая ищет наличие заявки.

Запуск клиента может выглядеть примерно так:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options =>
    {
        // this sets up a default authorization policy for the application
        // in this case, authenticated users are required
        // (besides controllers/actions that have [AllowAnonymous])
        var policy = new AuthorizationPolicyBuilder()
               .RequireAuthenticatedUser()
               .RequireClaim("http://mynewapp.com/pilot-tester")
               .Build();
        options.Filters.Add(new AuthorizeFilter(policy));
    });

    JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

    services.AddAuthentication(options =>
    {
        options.DefaultScheme = "Cookies";
        options.DefaultChallengeScheme = "oidc";
    })
    .AddCookie("Cookies")
    .AddOpenIdConnect("oidc", options =>
    {
        options.SignInScheme = "Cookies";
        options.GetClaimsFromUserInfoEndpoint = true;
        options.ClaimActions.MapAll();
        options.Scope.Add("mynewapp");

        options.Authority = "http://localhost:5000";
        options.RequireHttpsMetadata = false;

        options.ClientId = "mvc";
        options.ClientSecret = "secret";
        options.ResponseType = "code id_token";
    });
}

Это только предоставит доступ кЛетчики-испытатели.Обратите внимание, что весь код, в котором используется атрибут AllowAnonymous, по-прежнему будет доступен для всех!

Если вы хотите запретить доступ к этим методам, вам необходимо проверить пользователя с помощью кода, например:

if (User.Identity.IsAuthenticated && 
    !User.HasClaim(c => c.Type == "http://mynewapp.com/pilot-tester"))
    return Redirect("...");

Как настроить IdentityServer:

Если ваше приложение представляет собой веб-сайт без других API-интерфейсов, вам необходимо добавить претензию в Identity.

В базе данных убедитесь, что добавлены следующие записи (значения являются примерами):

AspNetUserClaims - добавить заявку для каждого пользователя, который является пилот-тестером.Тип должен быть чем-то, что вы можете использовать для фильтра, например http://mynewapp.com/pilot-tester и значение true.

IdentityResources - mynewapp.Соответствует запрошенной области действия.

IdentityClaims - http://mynewapp.com/pilot-tester (связано с IdentityResource mynewapp).

Как это работает:

Пользователь является ресурсом с утверждениями.Для того чтобы токены были небольшими, заявки фильтруются по заявкам, являющимся частью запрошенных областей: openid, profile и mynewapp.

Все заявки, которые соответствуют типу, включены в коллекцию User.Identity.Claims,это используется при тестировании политики.


Если вы используете API, вам следует также защитить этот ресурс.Добавить запись в ApiResources Api1.Клиентское приложение должно запросить область действия:

options.Scope.Add("api1");

Обратите внимание, что в этом случае ApiResource и ApiScope имеют одинаковые имена.Но отношение между ApiResource и ApiScope составляет 1: n.

Добавить запись в таблицу ApiClaims (или ApiScope, чтобы сузить ее):

ApiClaims - http://mynewapp.com/pilot-tester (связана с ApiResource Api1).

Пользовательский ресурс остается тем же самым, но теперь IdentityServer также добавит заявку в маркер доступа. Зарегистрируйте политику в API таким же образом, как указано выше.


Будучи временным, вы можете захотеть сделать фильтры условными, давая вам возможность включить / отключить фильтр.

Но вам, возможно, не придется кодировать вообще.Нахождение за прокси-сервером означает, что вы можете сначала посмотреть на параметры фильтра.Вы можете фильтровать по IP-адресу.Это означает, что вы можете предоставить доступ всем с определенных IP-адресов, не меняя приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...