1

私が取り組んでいるプロジェクトの役割ベースの承認を実装する際の問題を解決したいと考えています。プロジェクトは ASP.NET MVC 3 にあります。

アプリケーションはユーザーを認証し、これらのユーザーにはシステム全体の特定のロールが関連付けられています。この部分は私は大丈夫です。

問題は、アプリケーション内のプロジェクト、チーム、およびチーム ロールの概念で発生します。マネージャーが作成するプロジェクトごとに、チームを作成できます。このチームは、チーム内でロールを引き受ける他のシステム ユーザーで構成されますが、そのプロジェクトのみに使用されます。

したがって、ユーザーはあるプロジェクトでロール A を持ち、別のプロジェクトでロール B を持ち、別のプロジェクトでロール C を持つ場合があります。

私が直面している最大の問題は、現時点ではアクション メソッドに署名がある可能性があることです (実際のコードではなくサンプル コード)。

[Authorize(Roles = "SomeExampleSystemRole")]
public ActionResult DoSomeTask(Guid id)
{
    // id is the project id.
}

その場合、カスタム属性をコーディングしたとしても、メソッド内にいて「id」引数にアクセスできるようになるまで、ユーザーがこのタスクに関連してどのプロジェクト (およびその後はどのチーム) を呼び出していたのかわかりません。 .

これまでのところ、別のクラスを作成することを考えていましたが、これは現在のプロジェクト ID を認識できるように、アクション メソッド内に配置する必要があります。

[Authorize(Roles = "SomeExampleSystemRole")]
public ActionResult DoSomeTask(Guid id)
{
    // some code to get the current user identity.

    // id is the project id.
    TeamAuthorization auth = new TeamAuthorization(userIdentity, id);

    bool authPassed = auth.DoesUserHaveTeamRole("RoleC");
}

ただし、ユーザーが必要なシステム ロールを持っていない場合、アクション メソッド内の 2 次認証コードに到達することはありません。

この種の一時的な役割の問題をどのようにエレガントに解決できるかについて、誰かアイデアはありますか? さらに、私たちは「セッション」ベースの実装から離れており、「セッション」ベースのソリューションが管理しやすいとは考えていません。

私は現在、チームの役割がシステムの役割と異なるかどうかを調べています。そうであれば、上記の解決策が部分的に機能する可能性があります。

メソッドのパラメーターで「id」を読み取ることができるように属性を使用することは可能でしょうか?

どんな提案でも大歓迎です。どうもありがとう。

編集:

Authorizeユーザーが認証されていることを確認するために単純にグローバル属性を適用してから、システム ロールをクラスにロールアップしてTeamAuthorization、少なくともシステム ロールとチーム ロールを 1 つのスーパーに結合できるようにするのが最善かもしれないという追加の考えがありました。-設定。これは、プロジェクトまたはチーム ID がメソッドに渡されない (または明らかな) インスタンスでも機能する可能性があります。

4

1 に答える 1

1

Authorize 属性では、HttpContext を取得します。次のようなものを使用できます。

var routeData = new RouteCollection();

MvcApplication.RegisterRoutes(routeData);

var route = routeData.GetRouteData(httpContext);

MvcApplication は、グローバル アプリケーション クラスです。これにより、ルートがバインドされ、リクエストが解析されて、呼び出されたルートが得られます。その後、Id パラメーターを要求して、その上で追加の承認を実行できます。

于 2012-09-17T12:40:18.813 に答える