1

私のWebサイトでは、すべてのページで許可を確認する必要があります。すべてのページで同じコードを繰り返していることに気づきました。

これは私のページの1つです

public partial class KitView : AmsBasePage
{
    protected void Page_Load(object sender, EventArgs e)
    {
        IddUser user = new IddUser();
        user = (IddUser)Session["user"];

        bool isAdmin = user.roles.Where(IddRole => IddRole.R_ID.Equals(3)).First().IsInRole;
        bool isIddTeam = user.roles.Where(IddRole => IddRole.R_ID.Equals(2)).First().IsInRole;
        bool isProductionTeam = user.roles.Where(IddRole => IddRole.R_ID.Equals(1)).First().IsInRole;

        if (isAdmin)
        {
            hypAddComponent.Visible = true;
            hypAddComponent.NavigateUrl = "AddComponent.aspx?CKID=" + Request.QueryString["CKID"];
        }



    }
}

すべてのページでisAdmin、isIddTeam、isProductionTeamの役割を持つが、すべてのページコードで以下のコードを繰り返さないことがベストプラクティスです。

IddUser user = new IddUser();
        user = (IddUser)Session["user"];

        bool isAdmin = user.roles.Where(IddRole => IddRole.R_ID.Equals(3)).First().IsInRole;
        bool isIddTeam = user.roles.Where(IddRole => IddRole.R_ID.Equals(2)).First().IsInRole;
        bool isProductionTeam = user.roles.Where(IddRole => IddRole.R_ID.Equals(1)).First().IsInRole;
4

5 に答える 5

3

認証コードは、マスター ページ (ASP.NET Web フォーム) またはレイアウト ページ (ASP.NET MVC) に配置する必要があります。そうすれば、承認ロジックは 1 つの場所にのみ配置され、すべてのページで実行されます。

于 2013-03-05T07:49:33.300 に答える
1

認証コードの繰り返しを避けたい場合は、中央の場所で行う必要があります。

それには多くの方法がありますが、いくつかをお勧めします

  • マスター ページを使用する - マスター ページの OnLoad に認証コードを書き込む
  • HttpModule を作成する - ASP.NET ページ イベント パイプラインに独自のモジュールを挿入し、すべての承認および認証ロジックを処理します。

今、これは私が数百万ドルのプロジェクトで行ったことです

  • 継承元の PageBase.cs を作成しますSystem.Web.UI.Page- これは既に行っています
  • 現在の Page パーミッションを渡すことができる PageBase のコンストラクターを作成します。

     public void PageBase(AppActivityEnum PageView, AppActivityEnum PageEdit, AppActivityEnum PageDelete)
    {
      this.pageView = PageView;
      this.pageEdit=PageEdit;
      this.PageDelete=PageDelete;
    
      VerifyPermission();
    }  
    

ここで、VerifyPermission() は次のとおりです。

     public void VerifyPermission()
    {
        var currentUser= SessionHelper.GetCurrentUser();
        var permissions = Utility.GetUserPermissions(currentUser.RoleId);

            this.CanView=permissions.Contains((int)this.pageView);

            this.CanEdit=permissions.Contains((int)this.pageEdit);

            this.CanDelete=permissions.Contains((int)this.pageDelete);

    }

現在、これら 3 つの変数CanView, CanEdit, CanDeleteは のパブリック プロパティでPageBaseあるため、すべてのページ (継承した場所はどこでも) で使用できます。これらの変数に基づいて、コントロール (追加ボタン、削除ボタン)、ページの表示を設定できます。

したがって、基本的には、各ページの参照を格納するためのアクティビティ テーブルを作成します。アクティビティ テーブルは次のようになります

  • ID
  • 名前
  • 価値

この表の典型的なエントリは次のようになります。

  1 Module-Master           MMaster       NULL 
  2 Module-Master-View      MMasterView    1 
  3 Module-Master-Edit      MMasterEdit    1 
  4 Module-Master-Delete    MMasterDelete  1

RoleAppActivtyMapping を維持します (明らかに):

 Id   RoleId  AppActivityId
   1    1        2
   1    1        3
   1    1        4

したがって、 RoleId one には 3 つの権限がすべてあります。

GetUserPermissions(RoleId)基本的に、渡されたロールに対応するすべてのエントリを取得しますRoleAppActivityMapping

したがって、すべてのページで PageBase のコンストラクターを呼び出して、ビューのアクセス許可を確認します。コンストラクターで現在のページの AppActivity Id を渡します。CanView が false の場合: URL にアクセスすると、「UnAuthorized」ページにリダイレクトされます。

于 2013-03-05T08:02:52.157 に答える
1

冗長なコードを避けたい場合は、ロジックを別の場所に書くことをお勧めします。authorizationロジックがある場合は、ロジックを a にclass書くこともできます。次に、それらを に継承します。 注:継承した基本クラスからの が最初に実行されるように、イベントを実行する必要があります。aurthorizationMasterPagewebforms
webformsoverridepage_loadauthorization

于 2013-03-05T07:49:24.263 に答える
0

すべてのページが から継承する AmsBasePage クラスを追加しました。このコード

private bool _isAdmin;
    private bool _isIddTeam;
    private bool _isProductionTeam;




    protected bool isAdmin
    {
        get { return _isAdmin; }
        set { _isAdmin = value; }
    }

    protected bool isIddTeam
    {
        get { return _isIddTeam; }
        set { _isIddTeam = value; }
    }

    protected bool isProductionTeam
    {
        get { return _isProductionTeam; }
        set { _isProductionTeam = value; }
    }
于 2013-03-05T07:54:51.603 に答える
0

マスターページで承認を確認してください。そうすれば、一度チェックされ、繰り返しを避けることができます。

于 2013-03-05T08:00:24.970 に答える