Несколько просмотров Active Directory в приложении MVC3 - PullRequest
2 голосов
/ 24 февраля 2011

Мое приложение MVC позволяет подмножеству пользователей вставлять / редактировать записи в таблице, и, поскольку я использую аутентификацию Windows, я получаю их samaccountnames «бесплатно» и могу вставить их в поле «Последнее обновление по» вупомянутые записи.

Одно из самых важных (и часто используемых) представлений в моем приложении будет отображать списки по 50-100 записей на страницу, но я не хочу отображать их имена samaccount.Мне нужны более удобные для пользователя отображаемые имена, которые я хочу получить из 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.
}

Моя проблема сейчас заключается в том, как получить доступ к этой информации.Я думал об использовании ToSingleton от Ninject, но подозреваю, что это может быть «процесс Singleton Per Worker».Так что, возможно, кэш будет лучшим местом для этого.Но как лучше всего получить доступ к объекту?Статический класс со статическим свойством, который проверяет, находится ли он уже в Cache, инициализирует его иначе и возвращает объект?

Или есть более лучший способ решения этой проблемы?

1 Ответ

0 голосов
/ 24 февраля 2011

В конце концов я попробовал 2 решения:

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");
}

Второй метод был заметно быстрее, особенно после первого вызова, когда хранилище кэшировалось. Вы получаете лучший контроль над кэшированием тоже. Первый метод останется в памяти до перезапуска приложения.

Я не уверен насчет наилучшей практики в обоих случаях.

...