我正在实现一个使用事务传播的WCF服务。
带有SQL Server的ASP .nET安全模型(SqlRoleProvider)用于授权。我通过PrincipalPermission属性使用声明性安全性,如下所示。
[ServiceBehavior(TransactionIsolationLevel = IsolationLevel.Serializable)]
public class MyService : IMyService
{
[PrincipalPermission(SecurityAction.Demand, Role = "RoleName")]
[OperationBehavior(TransactionScopeRequired = true)]
public void DoSomething()
{
}
}
以下是问题:
我看到PrincipalPermission的授权检查(IsInRole)使用传播的事务作为环境事务来访问ASP.NET安全数据库。我不希望这样,因为这会锁定ASP.NET安全数据库中的表。此外,它在概念上是错误的,因为它只是一个访问权限检查,与业务数据库中完成的修改完全无关。
我理解我可以放弃声明性安全模型并使用新的TransactionScope以编程方式进行IsInRole检查(在适当的时候使用TransactionScopeOption.Suppress或TransactionScopeOption.RequiresNew),但是可以在保留声明性安全模型的同时实现这一点吗?
答案 0 :(得分:1)
解决方案:
我将'Enlist = false'添加到SQL安全数据库的连接字符串中;这样连接就不会参与事务上下文。