2

必要なセキュリティ スキームを実現できるカスタム メンバーシップ プロバイダーの構築に取り組んでいます。

私は独自の IPrincipal、IIdentity、および MembershipProvider を持っています。認証は正常に機能しています。私が今直面している問題は承認です。

私が承認スキームで抱えている問題は、本質的に IPrincipal の IsInRole 動作にあります。この動作は、ASP.NET Web フォームのさまざまな機能と密接に関連しています。私の主な関心事は、サイトマップの承認です。可能であれば使用したいからです。

したがって、伝統的に次のようなサイトマップを持っているかもしれません:

<siteMap xmlns="blahblah">
    <siteMapNode url="PersonView.aspx" 
        title="View Person" 
        description="View the details of a person" 
        roles="ViewerRole" />
</siteMap>

ここで、PersonView.aspx ページに移動しようとする人は、ViewerRole を持っている必要があります。ここで私の問題が発生します。ユーザーの役割に自分の承認を結びつけたくありません。代わりに、承認を実行中の動作に関連付けて、舞台裏の基になるものに承認を処理させたいと考えています。

だから私が本当に欲しいのは、代わりに次のようなものです:

<siteMap xmlns="blahblah">
    <siteMapNode url="PersonView.aspx" 
        title="View Person" 
        description="View the details of a person" 
        roles="Person|View" />
</siteMap>

これは、PersonView.aspx ページにアクセスしようとするすべてのユーザーが、 Personビジネス オブジェクトに対する表示権限を持っている必要があると解釈する必要があります。

次のような署名を持つ Authorizer オブジェクトが既にあります。

public static bool Authorize(Type type, Access access, IUser user)

たとえば、Person タイプ、View アクセス (列挙型)、およびそれをチェックするユーザーが必要です。これで、Authorize 内のコードがわかりました。

私の問題は、IPrincipal の IsInRole から Authorize にアクセスするにはどうすればよいですか? 私はさまざまなことを試しましたが、どれもうまくいかないようです。私は魔法の文字列のアプローチが本当に好きではありませんが、私はそれで立ち往生しているようです. 強く型付けされた方法でビルドする方法があれば、代わりにそれを好むでしょう。私が考えていないこれを行うためのより良い方法はありますか?

4

2 に答える 2

1

私は自分の問題を解決するためのかなりきれいな方法を見つけました。私がしたことは、タイプの代わりに列挙を受け入れるように Authorize 署名を変更し、それを IsInRole で使用して権限を決定することでした。

ので、私は持っています:

public static bool Authorize(AuthorizationType type, Access access, IUser user)

そして、次のように IsInRole で使用します。

public bool IsInRole(string role)
{
    var typeAndAccess = role.Split('|');
    var authType = 
        (AuthorizationType)Enum.Parse(
            typeof(AuthorizationType), typeAndAccess[0]);
    var access = (Access)Enum.Parse(typeof(Access), typeAndAccess[1]);

    return Authorizer.Authorize(
        authType, access, Context.User.Identity as IUser);
}

これにより、絶対に必要な場合 (サイトマップなど) にマジック ストリング アプローチを使用できますが、プログラムで使用する場合は、より厳密に型指定されたアプローチも使用できます。

void Page_Load(...)
{
    if (Context.User.IsInRole(AuthorizationType.Person + '|' + Access.View)
    {
        //I have view rights, do some stuff
    }   
}
于 2009-07-14T15:36:34.840 に答える