0

ルートが次のコントローラーがあるとします。Project/{ProjectID:int}/Page/{PageNumber:int} このコントローラーはプロジェクトを処理します。各プロジェクトには int ID があり、各プロジェクトには 100 ページがあります。

したがって、プロジェクト 1 の 33 ページには、次の方法でアクセスできます。

http://localhost/project/1/page/33

Authorize 属性を使用して、このコントローラーへのアクセスを保護できることはわかっています。たとえば、認証されたユーザーのみが「プロジェクト」にアクセスできます。

プロジェクトへのアクセスを保護するためのオプションは何ですか? たとえば、Bill はプロジェクト (1,2,3) にアクセスできるため、上記のコントローラーにアクセスできますが、アクセスできないようにするにはどうすればよいでしょうか?

http://localhost/project/4/page/13
4

2 に答える 2

2

厳密なコントローラ レベルの承認の場合AuthorizationAttributeは、これが最適な方法ですが、下位レベルの ID 承認の場合は、ユーザーが実際に使用できるものだけを単純にクエリするのが最善の方法であることがわかりました。

つまり、特定のプロジェクトを特定のユーザーのみが使用できる場合User、モデルに (または同様の) プロパティがあることは間違いありません (Projectデータベース レベルでの外部キーに相当します)。したがって、これを使用します: ID に基づいてプロジェクトを取得する場合は、ユーザーの条件も追加します。

var project = db.Projects.SingleOrDefault(m => m.Id == id && HttpContext.Current.Identity.Name == m.User.Username)
if (project == null)
{
    return new HttpNotFoundResult();
}

ある意味では、最初から適切なユーザーだけが利用できるようにするだけであれば、アクセスを制限する必要はありません。

于 2013-11-14T20:40:22.520 に答える
0

確かに、この目的にはAuthorization Attributeを使用することをお勧めします。ただし、他のアプローチを見つけた場合は、次のようなものを実装できます。

  protected void Application_AuthorizeRequest(Object sender, EventArgs e)
    {
     string userName = Request.LogonUserIdentity.Name; // Bill
     string page = Request.FilePath; //   project/4/page/    
     if !(AuthorizeUtil.CheckAccess(page, userName)
                   Context.RewritePath("/AccessDenied");     

    }
于 2013-11-14T20:22:52.997 に答える