为Master Pages / No Machine.Config编写自定义角色提供程序

时间:2009-03-07 18:30:53

标签: asp.net provider role

我想为我的应用程序编写一个自定义角色提供程序,它有现有的用户和角色表。我正在寻找一个参考,其中:

  • 不需要machine.config更改(我在自定义角色架构中看到了很多),
  • 支持可应用于需要不同权限的子页面的母版页。

2 个答案:

答案 0 :(得分:2)

可以在web.config中定义权限配置和提供者本身。要将权限应用于不同的子页面,只需通过web.config中的Location.System.Web.Authorization节点锁定内容页面(更多信息here)。

要创建自定义提供程序,只需继承(System.Web.Security)RoleProvider抽象类并实现所需的方法(典型的是IsUserInRole,GetUsersInRole和GetRolesForUser,尽管我的内存目前有点模糊什么Asp.Net开箱即用来进行基于角色的授权,所以你可能想要全部实现它们。更多信息here

完成后,您可以在web.config中注册要使用的提供程序:

<configuration>
  <system.web>
    <roleManager enabled="true"
      defaultProvider="YourRoleProviderHere">
      <providers>
        <add name="YourRoleProviderHere"
          type="YourRoleProviderHere, YourRoleProviderAssembly"
          description="Your totally awesome role provider"
        />
      </providers>
    </roleManager>
    ...

这会将您的应用设置为使用您的角色提供商,而且几乎没有任何工作,您就可以启动并运行。所有标准授权方法仍然有效(User.IsInRole),并且您已与Asp.Net集成。

答案 1 :(得分:0)

您也可以尝试使用HttpModule: - 修改示例应用程序中的代码,以便请求知道要请求的页面 - 显然您需要以下DbTables结构: - 这link将为您提供一个良好的开端

现在这个粗略的创建表语句将为您提供以下集合:

  • 每个用户都有一个或多个UserRoles
  • 每个页面都可以配置为按UserRole
  • 进行访问

围绕这个想法的一些DDL SQL:

CREATE TABLE [User](
    [UserId] [int] IDENTITY(1,1) NOT NULL,
    [FirstName] [varchar](100) NOT NULL,
    [SecondName] [varchar](100) NULL,
    [LastName] [varchar](100) NOT NULL,
    [DomainName] [varchar](100) NOT NULL,
    [UserRoleId] [int] NOT NULL,
    [Password] [nvarchar](100) NOT NULL
) ON [PRIMARY]

GO

 CREATE TABLE [dbo].[UserRole](
    [UsersRoleId] [int] IDENTITY(1,1) NOT NULL,
    [RoleId] [int] NOT NULL,
    [UserId] [int] NOT NULL
) ON [PRIMARY]



 CREATE TABLE [ga].[Roles](
    [RoleId] [int] IDENTITY(1,1) NOT NULL,
    [RoleName] [varchar](50) NOT NULL,
    [RoleDefinition] [varchar](1000) NULL
) ON [PRIMARY]

GO

 CREATE TABLE [dbo].[Page](
[PageId] [int] IDENTITY(1,1) NOT NULL,
[PageName] [varchar](200) NOT NULL,
[PageDescription] [varchar](max) NOT NULL,
[PageTitle] [varchar](50) NOT NULL
) ON [PRIMARY]

GO


CREATE TABLE [dbo].[PagePerUserRole](
    [PageForRoleId] [int] IDENTITY(1,1) NOT NULL,
    [UserRoleId] [int] NOT NULL,
    [PageId] [int] NOT NULL
) ON [PRIMARY]

GO

CustomBaseClass

基本相同,但会检查用户是否可以访问asp.net页面生命周期的某些早期事件 - 例如OnInit

后者更不正统 - 但我使用复杂的身份验证机制(使用3 -rd软件系统)编写了一个应用程序,它似乎在生产中工作了一段时间; )