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