ライトセッションオブジェクトを使用してユーザーの承認の詳細を保持するカスタム認証メソッドを実行しています。ここで、各ページ(主にマスターの子ページ)が、ユーザーがそのページにアクセスできるかどうかを判断できるようにします。
ページクラスを作成し、そこから子ページを派生させる必要がありますか?
アプリケーションがどのロールがどのページにアクセスできるかを知るための最良の方法は何ですか?
ライトセッションオブジェクトを使用してユーザーの承認の詳細を保持するカスタム認証メソッドを実行しています。ここで、各ページ(主にマスターの子ページ)が、ユーザーがそのページにアクセスできるかどうかを判断できるようにします。
ページクラスを作成し、そこから子ページを派生させる必要がありますか?
アプリケーションがどのロールがどのページにアクセスできるかを知るための最良の方法は何ですか?
ベースページのアプローチは好きではありません。私には、セキュリティのチェックには遅すぎます。独自の HttpModule を作成して、認証情報を database/xml/... に保存するか、ページのリフレクションを使用して読み取ることができます。
context.Handler は、実行中のクラス Page を保持します。したがって、次のようなことができます。
私が使用するコードの一部をコピーします。ロール、公開ページをチェックし、画像とスクリプトのチェックをスキップします (ただし、同様に行うこともできます)。
// In the HttpModule:
public void context_PreRequestHandlerExecute(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
// Don´t validate permissions if the user wasn´t allowed by the asp.net security
// Neighter the advanced (custom) permissions are validated for non ASPX files.
if (!context.Request.FilePath.EndsWith(".aspx") || !context.User.Identity.IsAuthenticated)
return;
// Give full access to the unathorized error page, and logins, and so on...
string pageClass = context.Handler.GetType().BaseType.FullName;
string param = context.Request["p"];
if (!string.IsNullOrEmpty(param))
pageClass += "@" + param;
if (SecurityService.IsFullTrustClass(pageClass))
return;
if (SecurityService.Context.CurrentPerson == null)
{
LogOff();
return;
}
// Verify access permissions for the current page
IList<Role> roles = SecurityService.Context.CurrentPerson.Roles;
bool allow = SecurityService.HasAccessPermission(pageClass, roles);
if (!allow)
{
LogOff();
}
}
同じシナリオで、認証が必要なページをフォルダーに配置し、web.configでlocation要素を定義して、次のような認証を構成します。
<location path="protected">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
承認にかなりの柔軟性が必要な場合は、カスタム ページ クラスを使用することをお勧めします。そうでWeb.config
なければ、十分なはずです。
カスタム ロール プロバイダーをプラグインすると、実際には asp.net 構成に依存することができます。ユーザーが特定のページへのアクセスを許可されているかどうかを確認できる方法があります。
System.Web.Security.UrlAuthorizationModule.CheckUrlAccessForPrincipal(
"~/admin/test.aspx", principal, "GET"
);
次に、web.config で通常のアプローチを使用して承認を構成します。その際、ページが同じフォルダーにある場合は、そのフォルダーに web.config を追加して、承認を適切に構成するだけです。