在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个组,但我认为这不足以减慢它的速度。
答案 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();
}
}