MVC自定义角色提供程序未被命中

3
我添加了一个自定义角色提供程序,但由于某种原因它并未被使用,似乎默认的角色提供程序仍在使用。以下是我的自定义角色提供程序代码:
namespace Models.Security
{
    public class MatchMakerRoleProvider: RoleProvider
    {
        public override string[] GetRolesForUser(string username)
        {
            username = username.Split('\\')[1].ToLower();
            using (var db = new EncodingEntities())
            {
                var user = db.Admin_Users.FirstOrDefault(u => u.UserName.Equals(username, StringComparison.CurrentCultureIgnoreCase));


                    var roles = from ur in user.Admin_UserRoles
                        from r in db.Admin_Roles
                        where ur.RoleId == r.RoleId
                        select r.RoleName;
                    if (roles != null)
                        return roles.ToArray();
                    else
                        return new string[] {};
            }
        }

        public override string[] GetUsersInRole(string roleName)
        {
            throw new NotImplementedException();
        }

        public override bool IsUserInRole(string username, string roleName)
        {
            using (var db = new EncodingEntities())
            {
                var user = db.Admin_Users.FirstOrDefault(u => u.UserName.Equals(username, StringComparison.CurrentCultureIgnoreCase));

                var roles = from ur in user.Admin_UserRoles
                            from r in db.Admin_Roles
                            where ur.RoleId == r.RoleId
                            select r.RoleName;
                if (user != null)
                    return roles.Any(r => r.Equals(roleName, StringComparison.CurrentCultureIgnoreCase));
                else
                    return false;
            }
        }
    }
}

我的控制器

[Authorize(Roles = "SuperAdmin")]
public class AdminController : Controller

并且Web.Config

<authentication mode="Windows">
</authentication>
<roleManager enabled="true" defaultProvider="MatchMakerRoleProvider" cacheRolesInCookie="true">
  <providers>
    <clear/>
    <add name="MatchMakerRoleProvider" type="Models.Security.MatchMakerRoleProvider" />
  </providers>
</roleManager>

如果我在CustomRoleProvider中设置断点,它从未被触发……有什么想法吗?

当使用这样的组件时,调试器并不总是会被触发。由于某种原因,它们无法正确地在调试器中连接起来。因此,可以添加 Debugger.Break() 语句来强制调试器停止。 - Erik Funkenbusch
实际上,我只是为了OP而进行了更改,我会修复它的,在实际代码中这不是一个问题。另外,我尝试添加了调试内容,但仍然没有被触发。 - StevieB
1
不在同一个解决方案中...我实际上只是通过在web.config文件的rolemanager部分中将cacheRolesInCookie="true" 删除而获得了一些运气。 - StevieB
1
这只是意味着你需要删除你的 cookie.. 你应该保留设置,但在需要测试时删除你的 cookie。或者记得添加回设置。 - Erik Funkenbusch
啊,那就有道理了!谢谢Erik。 - StevieB
显示剩余2条评论
1个回答

1

您的自定义提供程序代码是否在解决方案中的单独项目中,并作为引用添加到解决方案中的MVC项目中?如果是这样,您可能需要像这样:

<add name="CustomRoleProvider" type="Namespace.For.CustomRoleProvider, Your.Assembly.Name" />

2
不是在同一个解决方案中...实际上,我刚刚通过在web.config文件的rolemanager部分中将cacheRolesInCookie="true"删除来解决了这个问题。 - StevieB
这对我也解决了问题,但我不禁想到我们正在忽略潜在的问题。肯定可以缓存角色,不是吗? - Philip Stratford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接