我正在使用自定义身份验证方法,该方法使用轻型会话对象来保存用户的授权详细信息。现在我希望每个页面(主要是母版的子页面)能够判断用户是否应该有权访问该页面。
我应该创建一个页面类并从中派生子页面吗?
应用程序知道哪些角色可以访问哪个页面的最佳方式是什么?
答案 0 :(得分:1)
我不喜欢基页面方法。对我来说,检查安全性的东西为时已晚。 您可以创建自己的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();
}
}
答案 1 :(得分:0)
如果您在授权方面需要很大的灵活性,最好使用自定义页面类。否则,Web.config
就足够了。
答案 2 :(得分:0)
如果您使用自定义角色提供程序插入它,您实际上可以依赖asp.net配置。有一种方法可以让您检查用户是否有权访问给定页面:
System.Web.Security.UrlAuthorizationModule.CheckUrlAccessForPrincipal(
"~/admin/test.aspx", principal, "GET"
);
然后,您可以在web.config上使用常规方法来配置授权。执行此操作时,如果页面位于同一文件夹中,则只需将web.config添加到该文件夹并相应地配置授权。
答案 3 :(得分:0)
在相同的场景中,我将需要身份验证的页面放在一个文件夹中,并在web.config中定义location元素以配置如下身份验证:
<location path="protected">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>