代碼演示ADO.NET CAS權(quán)限訪問
隨著ADO.NET的發(fā)展,我們運(yùn)用起來也非常緊張,這里就使用ADO.NET CAS權(quán)限驗(yàn)證代碼。這里我們就詳細(xì)的分析一下吧。對于部分信任方案,可以通過指定SqlClientPermissionAttribute來要求代碼中的特定方法具有CAS特權(quán)。如果當(dāng)前受限制的安全策略不允許該權(quán)限,在運(yùn)行代碼之前將引發(fā)異常。有關(guān)安全策略的更多信息,請參見安全策略管理和安全策略最佳實(shí)施策略。
#T#在設(shè)計(jì)ADO.NET CAS權(quán)限時,正確的模式是以限制性最強(qiáng)的情況開始(無任何權(quán)限),然后添加代碼執(zhí)行特定任務(wù)所需的特定權(quán)限。相反的模式是一開始就授予所有權(quán)限,然后拒絕特定權(quán)限,這樣做是不安全的,因?yàn)楸磉_(dá)同一連接字符串可以有許多方式。例如,如果一開始就授予所有權(quán)限,然后嘗試拒絕使用連接字符串“server=someserver”,則仍將允許使用“server=someserver.mycompany.com”。通過在開始時始終不授予任何權(quán)限,可以降低權(quán)限集中存在漏洞的幾率。
下面的代碼演示SqlClient如何執(zhí)行安全請求,如果沒有相應(yīng)的ADO.NET CAS權(quán)限,將引發(fā)SecurityException??刂婆_窗口中顯示SecurityException輸出。
- PrivateSubTestCAS(ByValconnectString1AsString,ByValconnectString2AsString)
- 'SimulateremovingSqlClientpermissions.
- DimpermissionAsNewSqlClientPermission(PermissionState.Unrestricted)
- permission.Deny()
- 'Trytoopenaconnection.
- Try
- UsingconnectionAsNewSqlConnection(connectString1)
- connection.Open()
- Console.WriteLine("Connectionopened,unexpected.")
- EndUsing
- CatchexAsSystem.Security.SecurityException
- Console.WriteLine("Failed,asexpected:{0}",_
- ex.FirstPermissionThatFailed)
- 'UncommentthefollowinglinetoseeExceptiondetails.
- 'Console.WriteLine("BaseException:{0}",ex.GetBaseException())
- EndTry
- SqlClientPermission.RevertAll()
- 'Addpermissionforaspecificconnectionstring.
- 'Thiswouldtypicallybeachievedbytheadministrator
- 'deployingaCASpolicy,notinyourcode.
- permission=NewSqlClientPermission(PermissionState.None)
- permission.Add(connectString1,"",KeyRestrictionBehavior.AllowOnly)
- permission.PermitOnly()
- 'Tryagain,itshouldsucceednow.
- Try
- UsingconnectionAsNewSqlConnection(connectString1)
- connection.Open()
- Console.WriteLine("Connectionopened,asexpected.")
- EndUsing
- CatchexAsSystem.Security.SecurityException
- Console.WriteLine("Unexpectedfailure:{0}",ex.Message)
- EndTry
- 'Tryadifferentconnectionstring.Thisshouldfail.
- Try
- UsingconnectionAsNewSqlConnection(connectString2)
- connection.Open()
- Console.WriteLine("Connectionopened,unexpected.")
- EndUsing
- CatchexAsSystem.Security.SecurityException
- Console.WriteLine("Failed,asexpected:{0}",ex.Message)
- EndTry
- EndSub
在控制臺窗口中應(yīng)看到以下輸出:
- Failed,asexpected:<IPermissionclassIPermissionclass="System.Data.SqlClient.
- SqlClientPermission,System.Data,Version=2.0.0.0,
- Culture=neutral,PublicKeyToken=b77a5c561934e089"version="1"
- AllowBlankPassword="False">
- <addConnectionStringaddConnectionString="DataSource=(local);InitialCatalog=
- Northwind;IntegratedSecurity=SSPI"KeyRestrictions=""
- KeyRestrictionBehavior="AllowOnly"/>
- </IPermission>
- Connectionopened,asexpected.
- Failed,asexpected:Requestfailed.