0

我正在做一种自定义身份验证方法,它使用轻会话对象来保存用户的授权详细信息。现在我希望每个页面(主要是母版的子页面)能够判断用户是否应该有权访问该页面。

我应该创建一个页面类并从中派生子页面吗?

应用程序知道哪些角色可以访问哪个页面的最佳方式是什么?

4

4 回答 4

1

我不喜欢基页方法。对我来说,检查安全的东西为时已晚。您可以创建自己的 HttpModule 来检查这一点,或者将授权信息存储在数据库/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();
        }
    }
于 2009-03-06T22:35:20.727 回答
0

如果您在授权方面需要更大的灵活性,您最好使用自定义页面类。否则,Web.config应该够了。

于 2009-03-06T22:12:42.250 回答
0

如果您使用自定义角色提供程序插入它,您实际上可以依赖 asp.net 配置。有一种方法可以让您检查用户是否有权访问给定页面:

System.Web.Security.UrlAuthorizationModule.CheckUrlAccessForPrincipal(
     "~/admin/test.aspx", principal, "GET"
);

然后,您可以在 web.config 上使用常规方法来配置授权。这样做时,如果页面位于同一文件夹中,您只需将 web.config 添加到该文件夹​​并适当地配置授权即可。

于 2009-03-06T22:13:58.283 回答
0

在相同的场景中,我将需要身份验证的页面放在一个文件夹中,并在 web.config 中定义 location 元素来配置身份验证,如下所示:

<location path="protected">
     <system.web>
        <authorization>
          <deny users="?"/>
        </authorization>
    </system.web>
</location>
于 2009-03-06T22:23:06.937 回答