ASP.NET中的自定义角色/权限

时间:2012-05-16 20:03:39

标签: c# asp.net session permissions windows-authentication

我目前有一个Web应用程序正在使用它自己的“权限”表,其中包含以下列:

  • UserName - Windows UserName(Context.User.Identity.Name)
  • DivisionID - 分部表的链接
  • RoleID - 来自自定义角色表
  • RegionID - 最近添加的字段将我的应用程序划分为国家/地区(加拿大,美国,国际)

当用户登录网站时,他们会选择要输入的区域,并且我需要根据他们是否为该特定RegionID设置了任何权限,授予他们访问这些区域的权限。选择Region后,RegionID将存储在Session中,并将用于此权限检查并定义如何在页面上填充数据(我还没有将Session变量实现到所有页面中,以便可以更改需要))

我最初的想法是在每个页面上运行我的权限检查,将它们发送到三个目的地之一:

  • 无效的权限页面(false)
  • 区域选择页面 - 在会话中没有选择区域(RegionID = 0)
  • 他们请求的页面 - 如果有为该区域设置的权限

我还研究过使用Global.asax中的Application_AuthenticateRequest方法,但是我不能在这个区域内使用Session,它似乎比应该更多地访问Application_AuthenticateRequest。

使用我当前的应用程序,基于权限对每个用户及其相应区域进行身份验证的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

通常情况下我不会推荐这种方法,但由于您似乎已经开发了应用程序,因此可以相对轻松地实现以下操作而不会出现太多动荡:

为您的页面创建基类,然后从基类继承应用程序中的所有页面。您当然会在基类中实现“授权”。

这个问题的一个相当令人讨厌的问题是,如果你忘记从基类派生你的页面,那么你的页面就没有安全性.....但你可能很容易忘记实现你的“权限检查” ” ......

这样的东西
public class AuthorizedPage: System.Web.UI.Page
{
    protected override void OnLoad(EventArgs e)
    {
       // ... authorization logic here...

       // Be sure to call the base class's OnLoad method!
       base.OnLoad(e);
    }
}

您可以查看ASP.net "BasePage" class ideas和此http://www.4guysfromrolla.com/articles/041305-1.aspx

或者,另一个想法,如果您使用了母版页,您也可以在母版页中执行此操作....

答案 1 :(得分:0)

我真的只使用表单身份验证 - 但我假设您将使用Windows身份验证进行成员资格和某种形式的自定义角色身份验证。我从来没有这样做,但人们会认为它应该有效。

http://msdn.microsoft.com/en-us/library/system.web.security.roleprovider.getrolesforuser

您可以创建一个自定义提供程序,该提供程序将考虑Region的Session值以返回正确的角色。我知道对于Web应用程序,默认提供程序将角色存储为客户端上的加密cookie。我认为你可以做类似的事情。