2012-03-28 12 views
4

大規模部門のSalesSummaryというレポートがあるとします。この部門には、各製品ごとに多数の小さなチームがあります。他のチームの製品ではなく、自分の製品に関する情報を見ることができるはずです。また、これらのチームごとに1つのドメイングループがあります。Reporting Servicesのパラメータに基づく制御レポートの許可

多くの製品があるため、各チームのSalesSummaryレポートをコピーして権限を設定するのは最良の選択肢ではありません。私は以下のRSに似たコードを使うことを考えていましたが、うまくいきません。 RSでは、System.Security.Principal.WindowsPrincipalはデフォルトで無効になっているようです。

Public Function isPermitted() As Boolean 
    Dim Principal As New System.Security.Principal.WindowsPrincipal(System.Security.Principal.WindowsIdentity.GetCurrent()) 
    If (Principal.IsInRole("group_prod")) Then 
     Return true 
    Else 
     Return false 
    End If 
End Function 

また、私はSQLサーバへRSからユーザIDを送信することができ、そして私のSPの内側に私はアクティブディレクトリを照会するには、以下のようなコードを使用することができると思いました。これはセキュリティの制限のためにも機能しません。

SELECT 
* 
FROM OPENQUERY(ADSI,'SELECT cn, ADsPath FROM ''LDAP://DC=Fabricam,DC=com'' WHERE objectCategory=''group''') 

この目標を達成するための簡単な方法はありますか?

ありがとうございました!

+2

私も同様の状況に陥りました。私はReportViewerコントロールを使用して、レポートサーバーへのリモートアクセスを制御し、個別のパラメータを渡しました。 – dotjoe

+0

レポートをエクスポートするとどのように機能しますか? ReportViewerを介してレポートをエクスポートするか、URLをRSに送信しますか。私は、人々がクエリー・ストリングを構築したり、ポスト変数を変更したりして、彼らの方法をハックすることを望んでいません。 – Reza

+0

AFAIKでは、ReportViewerもエクスポートを行います。ユーザーはレポートサーバーにアクセスすることさえできません。離散パラメータが安全であることを確認するだけで、パラメータのプロンプト段階でユーザが変更することはできません。 – dotjoe

答えて

3

(実行中のユーザーを識別するために埋め込みコードを使用する)最初のオプションは信頼できません。 SSRSコードは、ユーザーがレポートにアクセスするときに必ず実行されるわけではなく、サブスクリプションを実行しているときなど、そのユーザーの資格情報にアクセスできない場合があります。

2つ目の方法でも動作しますが、SQL ServerサービスアカウントにActive Directoryを照会するための適切なアクセス許可が必要です。

もう1つの方法は、グループメンバーシップまたはユーザー権限のコピーをSQLテーブルに保持することです。この表は、手作業または自動化プロセスで更新できます。次に、これを使用可能なパラメータとコアデータクエリの両方に簡単に組み込むことができます。

+0

私たちは既にユーザーグループとその特権をデータベースに保存していますが、ユーザー名も保持したくありません。維持することは本当に難しいです。問題は、ユーザーが属するグループを見つけることです。 SSRSについてのご意見ありがとうございます。 – Reza

1

だから私は、このコードになってしまった。今

 PrincipalContext domain = new PrincipalContext(ContextType.Domain, "AD"); 
     UserPrincipal user = UserPrincipal.FindByIdentity(domain, identityName); 
     //// if found - grab its groups 
     if (user != null) 
     { 
      PrincipalSearchResult<Principal> _groups = null; 
      int tries = 0; 
      //We have this while because GetGroups sometimes fails! Specially if you don't 
      // mention the domain in PrincipalContext 
      while (true) 
      { 
       try 
       { 
        _groups = user.GetGroups(); 
        break; 

       } 
       catch (Exception ex) 
       { 
        logger.Debug("get groups failed", ex); 
        if (tries > 5) throw; 
        tries++; 
       } 
      } 

      // iterate over all groups, just gets groups related to this app 
      foreach (Principal p in _groups) 
      { 
       // make sure to add only group principals 
       if (p is GroupPrincipal) 
       { 
        if (p.Name.StartsWith(GROUP_IDENTIFIER)) 
        { 
         this.groups.Add((GroupPrincipal)p); 
         this.groupNames.Add(p.Name); 
        } 
       } 
      } 
      } 

、あなたは関連グループのリストを持っていることをユーザーを許可するリストを確認することができます!

関連する問題