角色管理没有提供者?

时间:2011-05-11 07:52:01

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

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

首先我使用MS的登录视图模板,但由于我没有用户db,因此不会使用db 所以我无法添加角色提供程序,因此我无法使用Role类来检查users \ role

在我的情况下,我有一个会话,其中包含用户信息和他拥有的角色,我需要检查这些角色,以设置哪些控件将启用给用户,但标准方式是“在课堂上使用.net”或代码“

2 个答案:

答案 0 :(得分:7)

如果要使用部分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(),但我之前写过“最小”角色提供程序,只需要实现我上面列出的方法。这是针对“只读”角色,但Web应用程序没有更新它们。

然后,您需要将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访问会话数据(并检查{ {1}}在使用之前不为空),这将需要您的提供商代码中的HttpContext.Current

答案 1 :(得分:4)

您的问题并不是很清楚,但如果您想提供自己的逻辑来决定用户所属的角色,那么您可以按照以下方式执行此操作:

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

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>

(根据名称替换值)