ASP.NET MVC 5自定义角色提供程序不起作用?

时间:2015-06-16 15:37:41

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

我的自定义角色提供者出现了问题" 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>

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

任何人都可以帮我吗?

由于

1 个答案:

答案 0 :(得分:0)

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

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

  • 要进行调试,我首先要检查控制器操作方法中的HttpContext.Current.User.GetType()(一个不受保护的方法)。它是System.Web.Security.RolePrincipal类型吗?

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

<强>更新

您已确认RolePrincipalProviderName。我建议你使用调试器仔细检查它。特别是检查:

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

  • HttpContext.Current.User.IsInRole属性,该属性应与当前用户的名称相匹配。

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

您还可以尝试调用IsInRole方法:这会将缓存的角色列表标记为已更改,下次调用GetRoleswhere END_DATE between '" + asOfDate.AddDays(-30).ToShortDateString() + "' and '" + 时应调用您的自定义RoleProvider&#39 ;再次使用GetRolesForUser方法。