web-dev-qa-db-ja.com

ロールを使用したasp.net mvc承認

ユーザーの概念を持つasp.net mvcアプリケーションを作成しています。各ユーザーは、自分のプロファイルを編集できます。例えば:

特にエキサイティングなものはありません...

しかし、私は承認スキームで少し問題に遭遇しました。現在、システムには「管理者」と「DefaultUser」の2つの役割しかありませんが、今後さらに増える可能性があります。

通常のAuthorize属性を使用してAuthorizationを指定することはできません。両方のユーザーが同じロール(つまり、「DefaultUser」)に属しているためです。

したがって、Authorize Filterを次のように指定すると、

[Authorize(Roles = "DefaultUser")]

その後、影響はありません。 PersonID = 1は、自分のプロファイルにアクセスして(可能であれば)プロファイルを編集できますが、URLを http:// localhost/person/edit/2 に変更するだけで、 PersonID = 2のプロファイルを編集するための完全なアクセス権(ユーザーが実行できないようにする必要があります)。

これは、アクセスを許可する前に、ユーザーが要求しているアクションがユーザーに「属している」かどうかをチェックする独自の承認フィルターを作成する必要があることを意味しますか?つまり、現在ログインしているユーザーがパラメーター= 1の編集アクションを要求している場合、現在ログインしているユーザーがPersonID = 1であることを確認するためにカスタムチェックを実行する必要がありますか? 、そうでない場合は、アクセスを拒否しますか?

ここに明らかな何かが欠けているように感じるので、どんなガイダンスもいただければ幸いです。

24
dp.

たぶん、URLが http:// localhost/person/editme のようになり、現在ログインしているユーザーの編集フォームが表示されるように、コントローラーアクションを整理できます。この方法では、ユーザーがURLをハッキングして他のユーザーを編集することはできません。

62
Matt Hamilton

私の$ .02:

承認と認証は2つの異なるものです。簡単に言えば、問題はあなたがこれを行うことができますか?あなたの友達を選ぶことができます、あなたの鼻を選ぶことができますが、あなたの友達の鼻を選ぶことはできません!すべての役割で許可されている場合(ユーザーが手と鼻を持っている場合)は、承認を確認する必要はありません。ユーザーが自分のプロファイルにアクセスし、フォームの非表示の値またはリダイレクト(鼻ではなく、離れて)を使用してプロファイルIDをテストするためのPostメソッドを用意します。

他のプロファイルを編集するためのGetメソッドを用意し、ここで管理者の役割を確認してください-(私は医者です、私はあなたの鼻に物を突き刺すことを許可されています)...

36
James Fleming

より洗練されたソリューションは、[Authorize]を拡張するか、IAuthorizationFilterを実装して、次のように独自の承認アクションフィルターを作成することです。

public class AuthorizeOwnerAttribute: FilterAttribute, IAuthorizationFilter
{
    #region IAuthorizationFilter Members

    public void OnAuthorization(AuthorizationContext filterContext)
    {
        // add logic here that compares the currently logged in user, to the owner of the profile that is being edited
        // get currently logged in user info from filterContext.HttpContext.User.Identity;
        // get profile being edited from filterContext.RouteData or filterContext.Something
    }

    #endregion
}

OnAuthorizationメソッドに入る実際のロジックがどうなるかはわかりませんが、私のコメントから出発点がわかります。詳細を調べるには、Googleを使用する必要があります。ユーザーを別のビューにリダイレクトする方法、または別の場所([HandleError]属性など)で処理される強く型付けされた例外をスローするかどうか。

16
Saajid Ismail

マットは正しいです。

許可の目的は、その機能の実行が許可されていることを示すことです。つまり、ユーザーが実行しようとしているのは、その特定のIDに対して機能を実行できるかどうかです。

したがって、2つのソリューション:

  1. Mattが言ったように、IDをとらないが、現在ログインしているユーザーをセッション情報から検索して取得するアクションを実行します。
  2. IDを取得するアクションを実行しますが、管理者アクセスのみを許可します-必要に応じて他のユーザー情報を変更できます。

しかし、質問に答えるために、許可は「はい、この人はユーザーの変更アクションを使用できます」と言うだけであり、入力されたパラメーターに基づいていません。

もう1つの方法は、ユーザーが現在のユーザー==を取得したことを確認するか、別のアクションにリダイレクトして、そのユーザーを編集できないことを通知することです。ただし、 id、および現在ログインしているユーザーを取得します。

10
crucible

この問題の解決策: http://nerddinnerbook.s3.amazonaws.com/Part9.htm

"夕食を編集するときのUser.Identity.Nameプロパティの使用

次に、ユーザーを制限する承認ロジックを追加して、ユーザーが自分でホストしているディナーのプロパティのみを編集できるようにします...」

4
Wojtek