0

here で説明されているように、カスタム フィルター属性を使用してトークン ベースの承認を実装したとします。

また、タスクを返すコントローラーがあると仮定しましょう。

public IEnumerable<Task> Get()
{
    // return tasks for authorized user
}

では、許可されたユーザーのタスクのみを返すにはどうすればよいでしょうか? ユーザー ID をクエリ パラメータとして渡すことはできません。別のユーザーのタスクを要求することは禁止されています。

4

2 に答える 2

1

リンクしたサンプルのコードでは、トークン内のユーザーの名前が暗号化されています。フィルタでは、httpヘッダーからこのトークンを取得し、それを復号化してユーザー名に戻し、AuthorizedUserRepositoryに対してクエリを実行します。

AuthorizedUserRepository.GetUsers().First(x => x.Name == RSAClass.Decrypt(token));

名前の代わりにユーザーIDを使用して、このサンプルリポジトリの代わりに実際のリポジトリに対して作業することもできます。このすべてをコントローラーアクションまたはコンストラクターで繰り返し実行するか、ルートデータまたはいくつかのThreadStaticプロパティに沿って渡すことができます。本当に凝ったものにしたい場合は、クレームベースのセキュリティを実装し、現在のスレッドのプリンシパルにクレームを設定できます。本当にそれをどのように渡すかは問題ではありません。

最終的には、クエリまたはlinqステートメントのwhere句でこの値を使用して、ユーザーにアクセスを許可するデータにフィルターをかけます。

于 2012-09-28T03:48:17.113 に答える
1

アクション フィルターから HttpRouteData を強化し、コントローラー アクションで読み取ることができます。actionContext.ControllerContext.RouteData.Values.Add("UserId", someVaue );

System.Runtime.Remoting.Messaging.CallContext クラス ( GetData および SetData ) を使用することもできます。

于 2012-09-27T22:35:41.747 に答える