9

私の MVC アプリケーションは、個々のページ要求中に複数の場所でユーザーの役割を利用します。私の質問は、デフォルトの SqlRoleProvider がページ要求の存続期間中、現在のユーザーのロールをキャッシュするかどうかです。

たとえば、コントローラー メソッドの属性でロールを使用します。

[Authorize(Roles = "Admin")]

とカスタムコード

if (user.IsInRole(MembershipRole.Admin))
{
     // Do something
}
else if (user.IsInRole(MembershipRole.Printer))
{
     // Do something else
}

ロール プロバイダーがロールをキャッシュしない場合、既定のロール プロバイダーから継承するカスタム ロール プロバイダーを記述し、メソッドをオーバーライドしてロールを一度取得し、要求期間中キャッシュするのが最善の解決策ですか? これは、Authorize 属性と自分のコードの両方がキャッシュされたロールを利用する方法で実行できますか?

(ご参考までに、私は cacheRolesInCookie web.config オプションを使用して Cookie にロールをキャッシュしたくありません)。

ご提案いただきありがとうございます。

[ジョーの回答からトリガーされた詳細を含めるように編集]

System.Web.Mvc.AuthorizeAttribute を逆コンパイルすると、AuthorizeCore メソッドは、確認する各ロールに対して次のメソッドを呼び出します。

httpContext.User.IsInRole

次に、System.Web.Security.RolePrincipal (上記の「ユーザー」) をピアリングすると、以下の両方の方法で、ユーザーのロールのキャッシュされたコピーが実際に使用されます (空の場合はキャッシュにデータが入力されます)。

public string[] GetRoles()
public bool IsInRole(string role)

キャッシュは User のフィールドとして保存されるため、その有効期間はリクエストの間です。

メソッドは、以下を使用して役割を見つけます。

Roles.Providers[this._ProviderName].GetRolesForUser(this.Identity.Name)

そのため、アプリケーション用に選択したロール プロバイダー (既定またはカスタム) が使用されます。

4

1 に答える 1

7

RoleProviderASP.NET または ASP.NET MVC アプリケーションでを使用すると、リクエストの有効期間中ロールをキャッシュHttpContext.Userする が参照されます。RolePrincipal

ただし、ASP.NET ロールを使用する WCF サービスでは:

<behavior ...>
    <serviceAuthorization principalPermissionMode ="UseAspNetRoles"
                     roleProviderName ="MyRoleProvider" />
</behavior>

これは正しくありません。代わりに、ロールをキャッシュしないHttpContext.User内部クラスを参照します。代わりに、常に を呼び出します。System.ServiceModel.Security.RoleProviderPrincipalRoleProvider.IsUserInRole

すぐに使える RoleProvider はキャッシュを行わないため、基盤となるデータ ストアへの接続が繰り返される可能性があります。私には欠点のように思えます。最初のアクセスでロールをキャッシュするのは簡単だったでしょう。

デフォルトのものから継承するカスタムロールプロバイダーを作成し、メソッドをオーバーライドしてロールを一度取得し、リクエスト期間中それらをキャッシュするための最良のソリューションは何ですか?

ASP.NET または ASP.NET MVC では必要ありませんが、WCF では想定できます。Request 期間のキャッシュはおそらく を使用するHttpContext.Itemsため、 の存在への依存が導入されますHttpContextが、単体テストが難しくなることを除けば、必ずしも問題になるわけではありません。

これは、Authorize 属性と自分のコードの両方がキャッシュされたロールを利用する方法で行うことができますか?

カスタムを web.config で構成する場合、属性がそれを使用するRoleProviderために必要なことは何もありません。Authorize

于 2012-12-12T14:55:17.240 に答える