Что вы должны сделать - это замкнуть конвейер, когда недопустимый или неизвестный пользователь хочет получить доступ к приложению.Вы можете сделать это с помощью 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-адресов, не меняя приложение.