Декларативная безопасность при работе сервиса через PrincipalPermission использует распространяемые клиентом транзакции - PullRequest
1 голос
/ 04 мая 2010

Я внедряю службу WCF, которая использует распространение транзакций.

Для авторизации используется модель безопасности ASP .nET с SQL Server (SqlRoleProvider). Я использую декларативную безопасность через атрибут PrincipalPermission, как показано ниже.

[ServiceBehavior(TransactionIsolationLevel = IsolationLevel.Serializable)]
public class MyService : IMyService
{
    [PrincipalPermission(SecurityAction.Demand, Role = "RoleName")]
    [OperationBehavior(TransactionScopeRequired = true)]
    public void DoSomething()
    {
    }
}

Вот вопрос:

Я вижу, что проверка авторизации (IsInRole) PrincipalPermission использует распространяющуюся транзакцию в качестве внешней транзакции для доступа к базе данных безопасности ASP.NET. Я не хочу этого, так как это блокирует таблицы в базе данных безопасности ASP.NET. Кроме того, это концептуально неправильно, так как это только проверка прав доступа и совершенно не связано с изменениями, внесенными в бизнес-базу данных.

Я понимаю, что могу отказаться от заявленной модели безопасности и программно выполнить проверку IsInRole, используя новый TransactionScope (используя TransactionScopeOption.Suppress или TransactionScopeOption.RequiresNew, когда это необходимо), но возможно ли достичь этого, сохранив декларативную модель безопасности?

1 Ответ

1 голос
/ 05 мая 2010

Решение:

Я добавил 'Enlist = false' в строку подключения к базе данных безопасности SQL; таким образом, соединение не должно участвовать в контексте транзакции.

...