我想为我的应用程序编写一个自定义角色提供程序,它具有现有的用户和角色表。我正在寻找一个参考,其中:
- 不需要 machine.config 更改(我在自定义角色架构中看到了很多),
- 支持可应用于需要不同权限的子页面的母版页。
权限的配置和提供者本身可以在 web.config 中定义。要将权限应用于不同的子页面,您只需通过 web.config 中的 Location.System.Web.Authorization 节点锁定内容页面(更多信息在这里)。
要创建自定义提供程序,您只需从 (System.Web.Security)RoleProvider 抽象类继承并实现您需要的方法(通常是 IsUserInRole、GetUsersInRole 和 GetRolesForUser,尽管我现在对 Asp. Net 开箱即用地调用基于角色的授权,因此您可能希望全部实现它们)。更多信息在这里。
完成后,在 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 集成。
您也可以尝试使用HttpModule: - 修改示例应用程序中的代码,以便请求知道要请求哪个页面 - 显然您需要以下 DbTables 结构: - 此链接将为您提供一个良好的开始
现在这个粗略的创建表语句将为您提供以下集合:
围绕这个想法的一些 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
基本相同,但会检查用户是否有权访问 asp.net 页面生命周期的一些非常早期的事件 - 例如 OnInit
后者是更非正统的方式 - 但我已经使用复杂的身份验证机制(使用 3-rd 软件系统)编写了一个应用程序,它似乎在生产中工作了一段时间;)