SQL Server Reporting Services(SSRS)レポートを作成しています。レポートを表示するエンドユーザーは、特定の入力パラメーター(この場合は場所)を選択できます。ユーザーが選択できる場所はActiveDirectoryグループメンバーシップによって異なるため、カスタムレポート関数でグループメンバーシップをアサートしようとしています。
(レポートはOracleデータベースに接続する共通のデータソースを使用するため、グループメンバーシップをデータベースに委任することはできません)
概念実証レポート内に次のカスタムコードを記述しました。
Function CheckRight(name As String) As String
Try
Dim nameParts = name.Split("/")
Dim user = name(1) + "@" + name(0)
Dim inrole As Boolean = IsInGroup(user, "Domain Users")
Return Iif(inrole, "Yes", "No")
Catch ex As Exception
Return ex.Message
End Try
End Function
Function IsInGroup(user As String, group As String) As Boolean
Dim identity AS System.Security.Principal.WindowsIdentity
identity = New System.Security.Principal.WindowsIdentity(user)
Dim principal = New System.Security.Principal.WindowsPrincipal(identity)
Return principal.IsInRole(group)
End Function
次の式を使用して、レポートに結果を表示しています。
=Code.CheckRight(User!UserID)
「はい」または「いいえ」を表示する代わりに、エラーが表示されます。
タイプ 'System.Security.Permissions.SecurityPermission、mscorlib、Version = 4.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089'のアクセス許可の要求が失敗しました。
(またはオランダ語: 'タイプSystem.Security.Permissions.SecurityPermission、mscorlib、バージョン= 4.0.0.0、カルチャー=ニュートラル、PublicKeyToken = b77a5c561934e089の許可要求が失敗しました。')
Visual Studio 2012を使用しているので、PrivateAssembliesはC:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ PrivateAssembliesにあります。
adriano-repettiの回答に基づく
PrivateAssemblies \ RSPreviewPolicy.configを編集し、ローカルで機能するようにしました。
<NamedPermissionSets>
<!-- added this extra permission set at the bottom: -->
<PermissionSet
class="NamedPermissionSet"
version="1"
Name="PermissionSetForIsInRole"
Description="Permission set that grants rights to WindowsPrincipal.IsInRole.">
<IPermission
class="SecurityPermission"
version="1"
Flags="Execution,ControlPrincipal"/>
</PermissionSet>
</NamedPermissionSets>
<PolicyLevel>
<Codegroup class="FirstMatchCodeGroup" ...>
<CodeGroup
class="FirstMatchCodeGroup"
version="1"
PermissionSetName="Nothing">
<IMembershipCondition
class="AllMembershipCondition"
version="1"
/>
<!-- changed 'Execution' to 'PermissionSetForIsInRole' here: -->
<CodeGroup
class="UnionCodeGroup"
version="1"
PermissionSetName="PermissionSetForIsInRole"
Name="Report_Expressions_Default_Permissions"
Description="This code group grants default permissions for code in report expressions and Code element. ">
<IMembershipCondition
class="StrongNameMembershipCondition"
version="1"
PublicKeyBlob="0024000..."
/>
</CodeGroup>
</CodeGroup>
</PolicyLevel>
WindowsPrincipal.IsInRole()
メソッドにはSecurityPermissionFlag.ControlPrincipal
権限が必要ですが、デフォルトではレポートのカスタムコードには付与されません。
名前付きのアクセス許可セットを含めるように構成を変更できます(この問題の詳細については、その記事も参照してください)。
<PermissionSet class="NamedPermissionSet"
version="1"
Name="PermissionSetForIsInRole"
Description="Permission set that grants rights to WindowsPrincipal.IsInRole.">
<IPermission class="SecurityPermission"
version="1"
Flags="Execution, ControlPrincipal"/>
</PermissionSet>
このパーミッションセットをright <CodeGroup>
(あなたの場合Report_Expressions_Default_Permissions
)およびright構成ファイルに関連付けることを忘れないでください。
これは全体的なセキュリティに影響しますか?もちろんそうです。必要な権限と、それを必要とするレポートにのみ付与する必要があります。SSRSレポートのセキュリティが正しく構成されている場合、これは問題にはなりません。
2番目のバージョンについては、透過コード(SSRSで実行されるコード)がセキュリティに対して透過的であり、セキュリティを直接アサート/変更できないため、機能しません(ルールCA2140:透過コードはセキュリティの重要な項目を参照してはなりません)。
透明性は、アプリケーションの一部として実行されるコードをインフラストラクチャの一部として実行されるコードから分離する強制メカニズムです。透明性は、ネイティブコードの呼び出しなど、特権的なことを実行できるコード(重要なコード)と実行できないコード(透過コード)の間に障壁をもたらします。透過コードは、操作対象のアクセス許可セットの範囲内でコマンドを実行できますが、重要なコードを実行、派生、または含めることはできません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加