0

ユーザーは1つ以上の部門に割り当てられます。Web Api、サービス層、DB内のユーザーアクセスをチェックするためのより良いアプローチ

ユーザーには、1つ以上のロール(例:)が割り当てられています。ロールを読むと、自分のタスクのみを表示できます。 チームメンバーロールは他のメンバーを表示および編集できます。担当の部門内のタスクが割り当てられています。 ロールのあるユーザ管理者は、システム内のすべてのタスクを表示および編集できます。

許可されていないアクセスの防止とパフォーマンス上の理由から、現在ログインしているユーザーIDをデータベースに完全に渡して、アクセス権のあるレコードのみを取得できるようにします。

当社のシステム設計は、次のとおりです。

ウェブAPI - >ビジネス/サービス層 - >リポジトリ - > DB

現在、我々はそれぞれの方法、それにサービス層へのWeb APIからユーザIDを渡していますユーザーがロールを持っているかどうかを確認チームメンバー(アクセス可能な部門内の他のユーザーのタスクを表示/編集することができます) と彼がアクセスできるすべての部署を取得し、さらにリポジトリに渡します。

各メソッドにユーザーIDを渡すことを避けるための方策はありますか? 上記のデザインで、ユーザーのアクセスをチェックするのに最適な場所は何ですか?

ユーザーIDパラメータを持たないメソッドで、別のアプリケーションで同じクラスを使用できるようにするのが理想的です。

アイデア?

+0

userIdとその他の関連情報をクッキーに渡してから、userIdやその他の情報の確認を処理する基本サービスを持つことができます。また、コールが許可されているかどうかを確認するためのクリーンな方法としてアトリビュートを使用することもできます。関連するサービスメソッドの上の例として[ReadOwnRoleRequired]。コード例を与えることができないので、今のところコメントとして残しておきます。 – NPhillips

+0

「チームメンバーの役割は、他のメンバーが割り当てられている部門内の他のタスクを表示および編集できる」と述べました。それから、関連するレコードを取得するには、ユーザーIDを渡す必要があると思います!それは正しい? –

+0

@NPhillips:ありがとう。しかし、ユーザーTeamMemberは、自分の部門の他のユーザーのタスクにアクセスできます。役割だけでなく、現在のユーザーがどの部門にアクセスしているかをチェックして、これらの部門のみを照会するためにDBに渡す必要があります。 – Iffi

答えて

0

は、クエリや他のタスクを実行するためのユーザーIDを必要とするサービスにいくつかのICurrentUserインスタンスを注入する依存性注入を使用してください。

public interface ICurrentUser 
{ 
    int UserId { get; } 
} 

public class AspNetCurrentUser : ICurrentUser 
{ 
    public int UserId { get { return HttpContext.Current.User.GetUserId<int>(); } } 
} 

public class Service : IService 
{ 
    private readonly ICurrentUser _currentUser; 

    public Service(ICurrentUser currentUser) 
    { 
     _currentUser = currentUser; 
    } 

    public object WorkWithUserId() 
    { 
     return _currentUser.UserId; 
    } 
} 
+0

私はこれに非常に似た何かをしました。 :) – Iffi

+0

@Iffi私はそれを聞いてうれしい! :) – maxbeaudoin

0

ユーザーが要求を発行する権利を持っているかどうかを確認するセキュリティレイヤー(サービスレイヤークラスを装飾するクラスで構成)を用意します。

たとえば、Web API呼び出しが../viewTask/456の場合、ユーザーがAdmin、タスクが所属する部門のチームメンバー、または自分のタスクであるかどうかを確認します。

デコレータクラスは、アクセス制御チェックが失敗した場合にUnauthorized例外を渡すか、または上げる場合、ラップされたサービスレイヤークラスに渡します。

のような何か...

public class SecuredTaskController : ApiController 
{ 
    private IContext _context; 
    private ITaskService _taskService; 
    // other services needed for access check (eg. userService?) 

    public SecuredTaskController(ITaskService taskService, IContext context 
     // other services needed for access check (eg. userService?) 
     ) 
    { 
     _taskService = taskService; 
     _context = context; 
    } 

    public IHttpActionResult Get(Task task) 
    { 
     if (hasGetAccess(task, _context.UserId)) 
      return Ok(_taskService.Get(task)); 
     else 
      return Unauthorized(); 
    } 

    private bool hasGetAccess(Task task, long userId) 
    { 
     // check if userId has acces to get task 
    } 
} 
+0

これの例を見ることは興味深いでしょう - おそらくGithubやGithubに何かがありますか? – dmcquiggin

関連する問題