真的很慢WindowsTokenRoleProvider

时间:2014-04-02 21:22:01

标签: asp.net asp.net-mvc active-directory windows-authentication

在MVC5应用程序中,我使用的是Windows身份验证,并希望将我们的Active Directory组用作角色,因为这是严格的Intranet应用程序。我正在使用WindowsTokenRoleProvider:

<roleManager defaultProvider="WindowsProvider" enabled="true" cacheRolesInCookie="false">
  <providers>
    <add name="WindowsProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
  </providers>
</roleManager>

我已经尝试了该配置的一些其他变体,包括使用cookie缓存,但最终结果是每组检查需要大约20秒。我检查这样的角色:

User.IsInRole(@"Domain\UserName")

在设置时我是否完全错过了什么?我无法相信每次检查花费20秒进行身份验证是正常的。我正在检查的用户大约有50个组,但我认为这不足以减慢它的速度。

1 个答案:

答案 0 :(得分:1)

此时最佳解决方案似乎是stackoverflow question

我可能会讨论如何检查/添加角色以确定我是否可以查明问题,但我不会指望这种缓慢只能在50个组中。

更新: 因此,在实际列举我的群组时,我发现我的用户在400多个群组中,这可能解释了为什么花了这么长时间。我仍然没有理解为什么用户上的IsInRole方法会调用GetRolesForUser而不是直接调用IsUserInRole,但这会使事情呈指数级增长

更新2: 旧答案已删除,所以这是我的班级:


    public class CustomWindowsTokenRoleProvider : WindowsTokenRoleProvider
    {
        public override string[] GetRolesForUser(string username)
        {
            List roles = null;
            string key = String.Concat(username, ":", base.ApplicationName);
            Cache cache = HttpContext.Current.Cache;

            if (cache[key] != null)
            {
                roles = new List(cache[key] as string[]);
            }

            if (roles == null)
            {
                roles = new List();

                // AppSettings.APPLICATION_GROUPS is an IEnumerable that returns just the groups that my application is interested in checking against
                foreach (string role in AppSettings.APPLICATION_GROUPS)
                {
                    if (base.IsUserInRole(username, role));
                    {
                        roles.Add(role);
                    }
                }

                cache.Insert(key, roles.ToArray(), null, DateTime.Now.AddHours(1), Cache.NoSlidingExpiration);
            }

            return roles.ToArray();
        }
    }