【问题标题】:Roles management with no provider?没有提供者的角色管理?
【发布时间】:2011-05-11 07:52:00
【问题描述】:

在我的应用程序中,我需要检查登录用户的角色以确定用户是否可以看到某些控件

首先我使用 MS 的 loginview 模板,但因为我没有用户数据库,也没有角色数据库 所以我无法添加角色提供者,所以我无法使用 Role 类来检查用户\角色

在我的情况下,我有一个包含用户信息和他所拥有角色的会话,我需要对这些角色进行检查以设置哪些控件将对用户启用,但使用标准方式“使用 .net 内置类或代码”

【问题讨论】:

    标签: .net asp.net asp.net-membership roleprovider


    【解决方案1】:

    如果您想使用部分 asp.net 成员资格/身份验证/授权服务,您需要实现自定义角色提供程序来执行角色成员资格检查。

    要做的第一件事是创建一个继承自System.Web.Security.RoleProvider 的类,其中听起来您最初关心实现的方法是:

    • FindUsersInRole
    • GetRolesForUser
    • GetUsersInRole
    • IsUserInRole

    所以,你最终会得到类似于:

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Web; 
    using System.Web.Security;
    
    public class MyCustomRoleProvider : RoleProvider
    {
        public override string[] FindUsersInRole(string roleName, string usernameToMatch)
        {
        }
    
        public override string[] GetRolesForUser(string username)
        {
        }
    
        public override string[] GetUsersInRole(string roleName)
        {
        }
    
        public override bool IsUserInRole(string username, string roleName)
        {
            return GetUsersInRole(roleName).Contains(username);
        }
    }
    

    注意:Visual Studio 将显示很多方法,例如 GetAllRolesthrows new NotImplementedException(),但我之前编写了一个“最低限度”角色提供程序,只需要实现我的方法已在上面列出。那是针对网络应用程序没有更新它们的“只读”角色。

    然后您需要将roleManager 元素添加到web.config 文件中的system.web 下,如下所示:

    <roleManager defaultProvider="NameOfYourRoleProvider" enabled="true">
        <providers>
            <clear />
             <add name="NameOfYourRoleProvider" type="Namespace.To.Your.Class.And.Class.Name, Name.Of.Assembly.Containing.Your.RoleProvider" />
        </providers>
    </roleManager>
    

    要记住的一点是,RoleProvider 实例是由底层 asp.net 基础架构创建的,因此您需要通过 HttpContext.Current.Session 访问会话数据(并检查 HttpContext.Current 是否存在) t null 在使用它之前),这将需要在您的提供程序的代码中使用using System.Web;

    【讨论】:

      【解决方案2】:

      您的问题并不太清楚,但如果您想提供自己的逻辑来决定用户属于什么角色,那么您可以这样做:

      使用您自己的自定义逻辑填写以下两种方法:

      public class MyRoleProvider : System.Web.Security.RoleProvider
      {
          public override string[] GetRolesForUser(string username)
          {
                // check a database or an xml file etc.
          }
      
          public override bool IsUserInRole(string username, string roleName)
          {
               // check a database or an xml file etc.
          }    
      }
      

      然后,将以下内容添加到您的 web.config:

      <roleManager enabled="true" defaultProvider="MyRoleProvider">
        <providers>
          <clear />
          <add name="MyRoleProvider" type="MyNameSpace.MyRoleProvider, MyProjectOrAssemblyName" />
        </providers>
      </roleManager>
      

      (根据名称替换值)

      【讨论】:

        猜你喜欢
        • 2011-02-17
        • 1970-01-01
        • 2011-01-13
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-08
        相关资源
        最近更新 更多