MVC3应用程序中的多个Active Directory查找

时间:2011-02-23 22:31:38

标签: c# asp.net-mvc active-directory directoryservices

我的MVC应用程序允许一部分用户在表中插入/编辑记录,因为我使用的是Windows身份验证,所以我可以“免费”获取他们的samaccountnames,并且可以将这些记录插入到“Last Updated By”字段中。提到的记录。

我的应用程序中最重要(和常用)的一个视图将显示每页50-100条记录的列表,但我不想显示它们的samaccountnames。我希望他们能够从Active Directory获得更加用户友好的显示名称。

我在这里看到几篇帖子建议将AD链接到SQL,但这需要在SQL服务器上安装我不想做的组件。相反,我正在考虑创建以下接口和派生类:

public interface IUserInformationStore
{
  UserInformation FindBySamAccountName(string samAccountName)
}

public class ActiveDirectoryStore
{
  HashSet<UserInformation> _cache;

  public UserInformation FindBySamAccountName(string samAccountName)
  {
    // Look for samaccountname in _cache and if not found
    // retrieve information from AD with DirectorySearcher.
    // Store information in _cache and return correct user.
}

我现在的问题是如何访问此信息。我在考虑使用Ninject的ToSingleton,但我怀疑这可能是“Singleton Per Worker进程”。也许Cache可能是一个更好的地方。但访问该对象的最佳方式是什么?具有静态属性的静态类,它检查它是否已经在Cache中,否则初始化它,并返回该对象?

还是有更好的解决方法吗?

1 个答案:

答案 0 :(得分:0)

我最终尝试了两种解决方案:

1

kernel.Bind<IUserRepository>().To<ActiveDirectoryUserRepository>().InSingletonScope().WithConstructorArgument("rootPath", "LDAP://dc=tessdata,dc=no");

public static MvcHtmlString GetDisplayNameSingleton(this HtmlHelper htmlHelper, string samAccountName)
{
  var userRepository = DependencyResolver.Current.GetService<IUserRepository>();
  return new MvcHtmlString(userRepository != null ? userRepository.FindByUsername(samAccountName).DisplayName : "Ukjent");
}

2

kernel.Bind<IUserRepository>().To<ActiveDirectoryUserRepository>().WithConstructorArgument("rootPath", "LDAP://dc=tessdata,dc=no");

public static MvcHtmlString GetDisplayName(this HtmlHelper htmlHelper, string samAccountName)
{
  if (HttpRuntime.Cache["UserRepository"] == null)
  {
    var newUserRepository = DependencyResolver.Current.GetService<IUserRepository>();
    HttpRuntime.Cache.Add("UserRepository", newUserRepository, null, DateTime.MaxValue,
                                  TimeSpan.FromMinutes(20), CacheItemPriority.Default, null);
  }
  var userRepository = HttpRuntime.Cache["UserRepository"] as IUserRepository;
  return new MvcHtmlString(userRepository != null ? userRepository.FindByUsername(samAccountName).DisplayName : "Ukjent");
}

第二种方法明显更快,特别是在缓存存储库的第一次调用之后。您也可以更好地控制缓存。第一种方法将保留在内存中,直到应用程序重新启动。

我不确定两种情况下的最佳做法。