【问题标题】:Writing Custom Roles Provider For Master Pages/No Machine.Config为母版页/无 Machine.Config 编写自定义角色提供程序
【发布时间】:2010-10-11 22:59:40
【问题描述】:

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

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

【问题讨论】:

    标签: asp.net provider role


    【解决方案1】:

    权限的配置和提供者本身可以在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 集成。

    【讨论】:

    • 我必须使用我网站上的内置登录控件还是可以将角色内容填充到现有代码中?
    【解决方案2】:

    您也可以尝试使用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 软件系统)编写了一个应用程序,它似乎在生产中工作了一段时间; )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      相关资源
      最近更新 更多