Сервисные шаблоны авторизации WCF

см. https://knexjs.org/#Builder-where

, попробуйте это:

.where((builder) => {

    if (req.query.customerId)
        builder.where('wo.customerId', req.query.customerId);

    if (req.query.companyId)
        builder.where('wo.companyId', req.query.companyId);

    if (req.query.invoiceId)
        builder.where('wo.invoiceId', req.query.invoiceId);

    if (req.query.open)
        builder.whereNull('wo.finishedAt');

    // so on..

});

вместо

.where(conditions)

7
задан Krishna 28 September 2008 в 02:31
поделиться

3 ответа

Для вопроса 1, абсолютно сделайте авторизацию сначала. Никакой код (в рамках Вашего управления) не должен выполняться перед авторизацией поддержать самую трудную безопасность. Пример Paul выше превосходен.

Для вопроса 2, Вы могли обработать это путем разделения на подклассы конкретной реализации услуги. Сделайте истинную реализацию бизнес-логики абстрактным классом с кратким обзором метод "CheckPermissions", как Вы упоминаете выше. Затем создайте 2 подкласса, один для использования WCF и одного (очень изолированный в не развернутом DLL), который возвращает true (или независимо от того, что Вы хотели бы, чтобы оно сделало в Вашем поблочном тестировании).

Пример (примечание, они не должны быть в том же файле или даже DLL хотя!):

public abstract class MyServiceImpl
{
    public void MyMethod(string entityId)
    {
        CheckPermissions(entityId);
        //move along...
    }
    protected abstract bool CheckPermissions(string entityId);
}

public class MyServiceUnitTest
{
    private bool CheckPermissions(string entityId)
    {
        return true;
    }
}

public class MyServiceMyAuth
{
    private bool CheckPermissions(string entityId)
    {
        //do some custom authentication
        return true;
    }
}

Затем Ваше развертывание WCF использует класс "MyServiceMyAuth", и Вы делаете свое поблочное тестирование против другого.

3
ответ дан 6 December 2019 в 14:11
поделиться

Для вопроса 1, лучше выполнять авторизацию сначала. Тем путем Вы не пропускаете сообщения об ошибках проверки назад неавторизованным пользователям.

BTW, вместо того, чтобы использовать метод аутентификации собственной разработки (то, которое я принимаю, - то, что Ваш CheckAccessPermission), Вы смогли сцепляться до программной поддержки WCF ролевых поставщиков ASP.NET. После того как это сделано, Вы выполняете авторизацию через OperationContext. Текущий. ServiceSecurityContext. PrimaryIdentity. IsInRole (). PrimaryIdentity является IPrincipal.

6
ответ дан 6 December 2019 в 14:11
поделиться

О вопросе № 2 я сделал бы это Внедрение зависимости использования и настроил бы Вашу реализацию услуги что-то вроде этого:

class MyService : IMyService
{
    public MyService() : this(new UserAuthorization()) { }
    public MyService(IAuthorization auth) { _auth = auth; }

    private IAuthorization _auth;

    public EntityInfo GetEntityInfo(string entityId)
    {
            _auth.CheckAccessPermission(PermissionType.GetEntity, 
                    user, entityId);

            //Get the entity info
    }
}

Обратите внимание, что IAuthorization является интерфейсом, который Вы определили бы.

Поскольку Вы собираетесь быть тестированием сервисного типа непосредственно (то есть, не выполняя его в WCF хостинг платформы), Вы просто настраиваете свой сервис для использования фиктивного типа IAuthorization, который позволяет все вызовы. Однако ЕЩЕ ЛУЧШИЙ тест должен дразнить IAuthorization и тест, которым это называют, когда и с параметрами, которые Вы ожидаете. Это позволяет Вам тестировать это, Ваши вызовы к методам авторизации допустимы, наряду с самим методом.

Разделение авторизации в свой собственный тип также позволяет Вам более легко тестировать это, это корректно в изоляции. В моем (хотя ограничено) опыт, использование DI "шаблоны" дает Вам значительно лучшее разделение проблем и тестируемости в Ваших типах, а также ведущий к более чистому интерфейсу (это, очевидно, открыто для дебатов).

Моей предпочтительной платформой насмешки является RhinoMocks, который свободен и имеет очень хороший быстрый интерфейс, но существует много других там. Если требуется знать больше о DI, вот некоторые хорошие капсюли и платформы .NET:

6
ответ дан 6 December 2019 в 14:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: