2017-10-31 21 views
0

私は4つのプロジェクトでC#.net 3.5 WAPソリューションを持っています。 Webアプリでは、管理者と人事部のみにアクセスできます。認可はAD役割によってweb.configで付与されます。問題は、すべての管理者がPage2にアクセスできる必要がある(しかし、私は彼にspecialmanagerと呼ぶことはできませんが)(デフォルトにアクセスできる)マネージャーを除いて、アプリケーションのDefaultとPage2にアクセスできます。 specialmanagerは、クエリ文字列でURLを介してPage2にアクセスしようとするとき、またはデフォルトページのgridview行からselectコマンドリンクを介してアクセスしようとするときに、カスタムアクセス拒否ページにリダイレクトされます。.net appは承認されたユーザーを認識しません

のWeb.config:

<authorization> 
      <allow roles="abc\hr, abc\managers, abc\it, abc\software tester"/> 
      <allow users="abc\specialmanager"/> 
      <!--<deny users="*"/>--> 
     <!--<allow users="*"/>--><!--default--> 
     </authorization> 
     <authentication mode="Windows"/> 
    <identity impersonate="true"/> 
     <customErrors mode="Off" defaultRedirect="~/Warning/AccessDenied.aspx"> 
      <error statusCode="401" redirect="~/Warning/AccessDenied.aspx" /> 
     </customErrors> 

私がリダイレクトを行っている方法でイベントの履歴をログに記録しようとしたが、私はトライキャッチ外のエラーログを配置するとき、HTTP 401.2エラーが続きます。私はこの1人のユーザーのためにSQLセキュリティをチェックしましたが、それは正しいです - それはアクセス権を持つ他のユーザーと同じです。私は、このユーザーがADグループのメンバーにアクセス権が与えられていることを確認しました。私はさらに、この特定のユーザーにロールに加えてユーザーとしてWeb設定の追加アクセスを許可し、カスタムアクセスへの同じリダイレクトでページの結果を拒否しました。 私はローカルのデバッグマシンでこのユーザーを偽装していますが、サーバーからアクセスするときに彼のマシンではうまく動作しません。本当に何が起こっているのかはわかりません。 私はすべてのページのUIでユーザ名を特定しており、彼は正しく識別されています。私はこれをデバッグして、アプリが彼が許可されていないと思う理由を調べる方法が不明です。彼のユーザー名は、そのようにアクセスする場合は、デフォルトのグリッドの行にリストされている3人のレビュアーのうちの1人と一致する必要があります。

私は関連性のあるコードのみを掲載しました。私はどのようにこれをデバッグするか、アイデアの助けが必要です - どんなアイデアですか?

コード名を取得するには:

//returns username portion of AD domain\username 
     public String GetUserName() 
     { 
      string curUser = Environment.UserName; //returns the logged-in account-name 

      //// impersonate a specific user during testing & development+ 
      //if (curUser == "user1" || curUser == "user2") 
      //{ 
      // curUser = "specialuser"; //local dev. Test as user specified here. 
      //} 
      //else 
      //{ 
      // return curUser; 
      //} 

      return curUser; 
     } 

     //check current user's membership in AD groups that are allowed to view form 
     //ref: http://stackoverflow.com/questions/12029378/how-to-check-if-a-user-belongs-to-an-ad-group 
     public List<Boolean> CheckGroupMembership() 
     { 
      List<bool> blnIsMember = new List<bool>(); 

      // set up domain context 
      PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "abc"); 

      // find a user 
      UserPrincipal user = UserPrincipal.FindByIdentity(ctx, GetUserName()); 

      for (int i = 0; i <= 3; i++) 
      { 
       // find the group in question 
       GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, _groupName[i]); 

       if (user != null) 
       { 
        // check if user is member of that group 
        if (user.IsMemberOf(group)) 
        { 
         _IsMember[i] = true; 

         blnIsMember.Add(_IsMember[i]);//add array to list 
        } 
        else 
        { 
         _IsMember[i] = false; 

         blnIsMember.Add(_IsMember[i]); 
        } 
       } 
      } 
      return blnIsMember; 
     } 

ページ2、をPage_Load()

protected void Page_Load(object sender, EventArgs e) 
     { 
      lblProgressStatus.Text = ""; 
      //Handle security depending on user's point of entry; 1) from app's default page or 2)Page2, URL/clicking on link in email notificiation 

       //call I_CurrentUser interface 
       I_CurrentUser user = new ReviewData(); 

       //get current username 
       strCurrentUser = user.GetUserName(); 
       HttpContext.Current.Session["UserName"] = strCurrentUser; 

       //check current user's membership against AD groups needed to gain access 
       _IsMember = user.CheckGroupMembership(); 

       //pass list to array 
       IsMember = _IsMember.ToArray(); //0=Admin, 1=Manager, 2=Developer, 3=Software Tester 

      //Hide Admin link if current user is NOT a member of admin[0], developer[2] or software tester[3] group 
      if (IsMember[0] == true || IsMember[2] == true || IsMember[3] == true) 
      { 
       //Link to Admin page 
       LinkButton3.Visible = true; 
      } 
      else 
      { 
       //Link to Admin page 
       LinkButton3.Visible = false; 
      } 

      //prepare to log any error messages 
      DataLib.ErrorLog oErrorLog = new DataLib.ErrorLog(); 

      if (!IsPostBack) 
      {    
       try 
       { 

       if (!string.IsNullOrEmpty(Request.QueryString["ID"])) 
       { 
        string id = Request.QueryString["ID"]; 
        intID = Convert.ToInt16(id); 

        string strID = intID.ToString(); 
        ViewState["ID"] = strID; 
        Session["ID"] = strID; 

        AuthorizeCurrentUserSelection(intID, strCurrentUser); 

        /* If DocID is not in querystring, the user has accessed form via URL. Determine if DocID exists: 
        * if it doesn't, Insert prelim record, if it does, update formname. 
        * Else DocID is in querystring.*/ 
        if (string.IsNullOrEmpty(Request.QueryString["DocID"]))      
        {  
         DataLib.EPRConn oGetID = new DataLib.EPRConn(); 
         intDocID = oGetID.SelectDocID(intID); //if docid does not exist it will return integer 0 

         string strDocID = intDocID.ToString(); 
         ViewState["SelectedDocID"] = strDocID; 
         Session["SelectedDocID"] = strDocID; 

         //Insert DocID when it's null or empty, or "0" 
         if (string.IsNullOrEmpty(strDocID) || strDocID == "0") 
         { 
          /*4/24/17 IMPORTANT: InsertDocID() executes an initial INSERT DocID into tbl1 and tbl2, 
          this allows Ratings to be UPDATED rather than INSERTED when radio buttons are 
          subsequently ticked and establishes DocID and FormName prior to first submit/save.*/ 

          DataLib.EPRConn oInsertID = new DataLib.EPRConn(); 
          oInsertID.InsertDocID(Convert.ToInt32(ViewState["ID"]), intDocID); 
         } 
         else //Update FormName if DocID exists. 
         { 
          FillCommentTextBoxes(strID); 

          FillMeritIncreaseTextBox(); 

          //Update tbl1.FormName and tbl2 where FormName IS NULL (to assign names to older forms created prior to this app's launch 
          DataLib.EPRConn oFN = new DataLib.EPRConn(); 
          oFN.UpdateFormName(intID); 
         }      
        } 
        else //DocID exists in querystring. 
        { 
         string dID = Request.QueryString["DocID"]; 
         intDocID = Convert.ToInt16(dID); 

         string strDocID = intDocID.ToString(); 
         ViewState["SelectedDocID"] = strDocID; 
         Session["SelectedDocID"] = strDocID; 

         FillCommentTextBoxes(strID); 

         FillMeritIncreaseTextBox(); 

         //Update FormName in 2 tables where FormName IS NULL (to assign names to older forms created prior to this app's 
         DataLib.EPRConn oFN = new DataLib.EPRConn(); 
         oFN.UpdateFormName(intID); 
        } 

ページ2へのリダイレクトを行うコード:

//pass form ID and viewing supervisor/current user 
    protected void AuthorizeCurrentUserSelection(int ID, string supUserName) 
      { 
       //Create a list of strings to hold up to 3 reviewers of selected employee 
       List<string> strLine = new List<string>(); 

       //prepare to log any errors thrown 
       DataLib.ErrorLog oErrorLog = new DatLib.ErrorLog(); 

       try 
       { 
        //return all rows from tbl 
        DataLib.EPRConn oAuth = new DataLib.EPRConn(); 
        strLine = oAuth.SelectSupervisorUserName(eID, supUserName); 

        string[] arr = strLine.ToArray(); 
        string strLevel1 = arr[0]; 
        string strLevel2 = arr[1]; 
        string strLevel3 = arr[2]; 


        //0=Admin, 1=Manager, 2=Developer, 3=Software Tester. 
        if (IsMember[0] == true || IsMember[2] == true || IsMember[3] == true    { 
         BindRepeater(); 
        } 
        //if current user is a manager and named in level1, 2 or 3, load grid 
        else if ((strLevel1 == strCurrentUser && IsMember[1] == true) || 
          (strLevel2 == strCurrentUser && IsMember[1] == true) || 
          (strLevel3 == strCurrentUser && IsMember[1] == true)) 
        { 
    //Example of error log that throws HTTP 401 error when uncommented  
    //oErrorLog.WriteErrorLog("(strCurrentUser=" + strCurrentUser + ") History Log: Line398-401_AuthorizeCurrentUserSelection(" + eID + ", supUserName=" + supUserName + "). Level1=" + strLevel1 + ", Level2=" + strLevel2 + ", Level3=" + strLevel3 + ", IsMember[1]=true "); 

         //hide Lock/Unlock buttons 
         Panel1.Visible = false; 
         //show grid 
         BindRepeater(); 
        } 
        else 
        { 
         //redirect 
         Response.Redirect("~/Warning/AccessDenied.aspx"); 
        }//end if/else 
       }//end try 

       catch (SqlException ex) 
       { 
        oErrorLog.WriteErrorLog("(" + strCurrentUser + ")SqlException in ReviewForm_AuthorizeCurrentUserSelection(): " + ex.ToString()); 
       } //end catch 
      } 
+1

これはActive Directoryの問題で、Special Managerはアクセスを許可するグループに属していません。 AD OUの&etcを細かい歯の櫛でレビューしてください。 –

+0

正しい方向に私を向けるための@Jeremyありがとうございます。あなたの洞察は私たちがADをもっと探求する必要があることを私のNAに確信させました。 – Doreen

答えて

0

私のNAと私は問題を理解しました。現在のユーザーを取得するコードはSystem.Environment.UserNameで、2000年以前の表示名を "smanager"ではなく "SManager"と表示されたADプロパティで取得します。アプリケーションのPage2へのアクセスが小文字である必要があるため、比較するとSPmanagersmanagerの3人のレビュアーのリストと一致しませんでした。

解決策は、今度は自動的に行われるUpperCaseの頭文字をすべての小文字に使用していたADの2000年前のユーザー名を新しいバージョンのADで変更することです。

MSDNは、Usernameプロパティを取得している場所では正確に指定されていません。

関連する問題