【问题标题】:ASP.NET MVC 5 Custom Role Provider Not Working?ASP.NET MVC 5 自定义角色提供程序不起作用?
【发布时间】:2015-06-16 15:37:41
【问题描述】:

我的自定义角色提供者“string[] GetRolesForUser(string username)”方法有问题,但过程没有通过它。我的代码是:

控制器(只是其中的一部分):

[Authorize(Roles="Administrator")]
public class UsersController : AdminBaseController
{
    private IUsersRepository users;
    private IDepartmentsRepository departments;

    public UsersController()
    {
        this.users = new UsersRepository(new TicketsContext());
        this.departments = new DepartmentsRepository(new TicketsContext());
    }
}

自定义角色提供者:

public class CustomRoleProvider : RoleProvider
{
    public override bool IsUserInRole(string username, string roleName)
    {
        var userRoles = GetRolesForUser(username);
        return userRoles.Contains(roleName);
    }

    public override string[] GetRolesForUser(string username)
    {
        //Return if the user is not authenticated
        if (!HttpContext.Current.User.Identity.IsAuthenticated)
            return null;

        //Return if present in Cache
        var cacheKey = string.Format("UserRoles_{0}", username);
        if (HttpRuntime.Cache[cacheKey] != null)
            return (string[])HttpRuntime.Cache[cacheKey];

        //Get the roles from DB
        var userRoles = new string[] { };
        var user = db.Users.Where(u => u.email == username).FirstOrDefault();
        if (user != null)
        {
            if(user.access_level == 0)
            {
                userRoles = new[] { "Administrator" };
            }
            else
            {
                userRoles = new[] { "Normal" };
            }
        }

        //Store in cache
        HttpRuntime.Cache.Insert(cacheKey, userRoles, null, DateTime.Now.AddMinutes(_cacheTimeoutInMinutes), Cache.NoSlidingExpiration);

        // Return
        return userRoles.ToArray();
    }
}

Web.config

<!-- Custom Role Provider -->
<roleManager enabled="true" defaultProvider="TicketsRoleProvider">
  <providers>
    <add name="TicketsRoleProvider"
         type="Tickets.CustomRoleProvider"
         cacheTimeoutInMinutes="30" />
  </providers>
</roleManager>

我无法让它工作,我不知道为什么。

谁能帮帮我?

谢谢

【问题讨论】:

  • 那是因为它使用了角色提供者的 IsUserInRole 方法。进入那个方法。
  • 如果我在那个方法(“IsUserInRole”)中放了一个断点仍然一样,不要通过它。我在问题中添加了方法,请看一下。
  • 对这个问题的评论有点晚了,但在你的例子中,没有办法设置 cacheTimeoutInMinutes > 所以我想知道它是否是默认值 (0)

标签: asp.net asp.net-mvc-5 roleprovider asp.net-mvc-5.2


【解决方案1】:

我看不到任何明显的东西,但我会:

  • 删除 GetRolesForUser 方法中对“HttpContext.Current.User.Identity.IsAuthenticated”的检查。此方法应该只获取作为参数提供的用户名的角色。

  • 为了调试,我首先检查控制器操作方法(不安全的方法)中的HttpContext.Current.User.GetType()。是System.Web.Security.RolePrincipal类型的吗?

  • 您应该在您的自定义RoleProvider 中实现IsUserInRole。实现可以只检查提供的角色是否在GetRolesForUser 返回的数组中。我不认为这是您的问题:RolePrincipal 不使用IsUserInRole(尽管如果您在 WCF 服务中使用 ASP.NET 角色,System.ServiceModel.Security.RoleProviderPrincipal 会使用它,所以实现是一个好主意无论如何。

更新

您已确认HttpContext.Current.UserRolePrincipal。我建议您使用调试器仔细检查它。特别检查:

  • ProviderName 属性,它应该与您的自定义 RoleProvider 的名称相匹配。

  • Identity 属性,应与当前用户的名称匹配。

您也可以尝试从控制器中的代码调用HttpContext.Current.User.IsInRole。第一次调用时,它应该调用您自定义 RoleProvider 的 GetRolesForUser 方法。

您也可以尝试调用RolePrincipal.SetDirty() 方法:这会将缓存的角色列表标记为已更改,下次调用IsInRoleGetRoles 应再次调用您自定义的RoleProvider 的GetRolesForUser 方法。

【讨论】:

  • 谢谢 ;) 我已经在自定义 RoleProvider 中实现了 IsUserInRole 并调试了 GetType,是的,它是 System.Web.Security.RolePrincipal 类型,打印屏幕 -> s21.postimg.org/3y21l6jyf/debug.png
  • @kanazaca - 查看更新以获取更多调试技巧。
  • 如何检查 ProviderName 是否返回我的自定义 RoleProvider ?当我使用 User.IsInRole 返回错误值时,似乎没有使用我的自定义角色提供程序。
  • @kanazaca - 名称是否与 web.config (TicketsRoleProvider) 中的名称匹配? Roles.Providers[ProviderName] 的类型是否正确(Tickets.CustomRoleProvider)?是否有可能您有另一个具有这种类型的组件?尝试覆盖自定义 RoleProvider 中的 Initialize 方法并在其中添加断点以查看它是否被命中。检查您是否已将自定义 RoleProvider 添加到应用程序根目录中的 web.config 中,而不是在子目录中(例如在 Views 子目录中)
猜你喜欢
  • 2014-10-15
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多