Документация API ServiceStack в Swagger-UI за закрытыми дверями

Я хочу разрешить доступ к swagger-ui и метаданным только в том случае, если пользователь аутентифицирован (формы auth) в нашем веб-приложении, но я хочу разрешать доступ API все время (API имеет некоторые общедоступные методы и некоторые из них требуют базового auth).

Итак, что я сделал, я добавил этот префикс маршрута для API:

public override RouteAttribute[] GetRouteAttributes(Type requestType)
{
 var routes = base.GetRouteAttributes(requestType);
 routes.Each(x => x.Path = "/API" + x.Path);
 return routes;
}

и

ServiceRoutes = new Dictionary<type, string[]=""> {
{
 typeof(AuthenticateService), new[] { "/api/auth", "/api/auth/{provider}" }
 },
}
</type,>

И это также в веб-конфигурации:

<location path="api">
<system.web>
 <authorization>
 <allow users="*">
 </allow></authorization>
</system.web>
</location>

И все дело в том, что когда я перехожу к /api/, теперь это прекрасно работает, но когда я пытаюсь вызвать какой-то метод, я получаю reddirected на мой маршрут login.

Есть ли способ решить это, как я начал, или есть лучший способ защитить документацию?

1 ответ

Нет явной возможности требовать проверку подлинности на страницах метаданных, но вы можете использовать PreRequestFilter для защиты доступа к страницам /metadata и /swagger-ui с помощью

PreRequestFilters.Add((req, res) =>
{
 if (req.PathInfo.StartsWith("/metadata") || req.PathInfo.StartsWith("/swagger-ui"))
 {
 var session = req.GetSession();
 if (!session.IsAuthenticated)
 {
 res.StatusCode = (int)HttpStatusCode.Unauthorized;
 res.EndRequest();
 }
 }
});

И чтобы защитить доступ к спецификации /openapi JSON, если вы используете Swagger 2.0/Open API Feature, вы можете динамически добавлять [Authenticate] атрибут во время выполнения с помощью:

public AppHost()
{
 typeof(OpenApiService)
 .AddAttributes(new AuthenticateAttribute());
}

Если вы используете более старый Swagger 1.2 Plugin, вы можете защитить доступ к бэкэнд-сервисам с помощью

public AppHost()
{
 typeof(SwaggerResource)
 .AddAttributes(new AuthenticateAttribute());
 typeof(SwaggerResources)
 .AddAttributes(new AuthenticateAttribute());
}

Предполагается, что вы используете Аутентификация ServiceStack, а не ASP.NET Auth.

licensed under cc by-sa 3.0 with attribution.