Требовать аутентификацию для (почти) каждого запроса с использованием ServiceStack - PullRequest
0 голосов
/ 09 мая 2018

Я создаю ERP с использованием ServiceStack, и у меня установлена ​​аутентификация и работает. Тем не менее, я хотел бы потребовать аутентификацию практически на каждом отдельном маршруте, DTO или статической странице - кроме страницы входа в систему и вспомогательных ресурсов (CSS, изображения).

Есть ли простой, централизованный способ сделать это? Я мог бы применить [Authenticate] к каждому DTO / маршруту, но было бы легко пропустить один.

Как мне потребовать аутентификацию для всех запросов, сохранить некоторые? Я подозреваю, что глобальный фильтр запросов какой-то формы, но я не уверен, как это запустить.

Ответы [ 2 ]

0 голосов
/ 09 мая 2018
Решение

@ mythz является наиболее правильным, но в моей ситуации у меня были некоторые конкретные дополнительные критерии, которые я изначально не задавал. А именно, я хотел разрешить Authenticate запросы и перенаправлять пользователей на страницу входа. Я использую пользовательский провайдер аутентификации ServiceStack.Authentication.Azure , поэтому у меня получилось перенаправление 303 вместо 403 Fail (или, что более уместно, 401 Unauthorized), чтобы он работал с моим провайдером в стиле OAuth .

this.GlobalRequestFilters.Add((req, res, requestDto) =>
{
    if (!req.IsAuthenticated() && !(requestDto is Authenticate))
    {
        res.RedirectToUrl("/auth/aadgraph?redirect=" + req.RawUrl.UrlEncode());
        res.EndRequest();
    }
});
0 голосов
/ 09 мая 2018

Правильно, самый простой способ - использовать Глобальный фильтр запросов :

GlobalRequestFilters.Add((req, res, dto) => {
    if (!req.IsAuthenticated())
    {
        res.StatusCode = (int) HttpStatusCode.Unauthorized;
        res.EndRequest();
    }
});

Это обеспечит проверку подлинности всех запросов на обслуживание, а также проверку подлинности запросов на обслуживание, не обработанных ServiceStack, вместо них можно использовать PreRequestFilters:

PreRequestFilters.Add((req, res) => {
    if (!req.IsAuthenticated())
    {
        res.StatusCode = (int) HttpStatusCode.Unauthorized;
        res.EndRequest();
    }
});
...