Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC3应用程序中的多个Active Directory查找_C#_Asp.net Mvc_Active Directory_Directoryservices - Fatal编程技术网

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

C# MVC3应用程序中的多个Active Directory查找,c#,asp.net-mvc,active-directory,directoryservices,C#,Asp.net Mvc,Active Directory,Directoryservices,我的MVC应用程序允许一部分用户在表中插入/编辑记录,由于我使用的是Windows身份验证,我可以“免费”获取他们的SAMAccountName,并可以将其插入到所述记录的“Last Updated By”字段中 我的应用程序中最重要(也是最常用)的视图之一将显示每页50-100条记录的列表,但我不想显示它们的SAMAccountName。我希望从Active Directory中获得更为用户友好的显示名称 我在这里看到过几篇文章建议将广告链接到SQL,但这需要在SQL server上安装组件,

我的MVC应用程序允许一部分用户在表中插入/编辑记录,由于我使用的是Windows身份验证,我可以“免费”获取他们的SAMAccountName,并可以将其插入到所述记录的“Last Updated By”字段中

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

我在这里看到过几篇文章建议将广告链接到SQL,但这需要在SQL server上安装组件,我不希望这样做。相反,我考虑创建以下接口和派生类:

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.
}
公共接口IUserInformationStore
{
用户信息FindBySamAccountName(字符串samAccountName)
}
公共类ActiveDirectoryStore
{
HashSet\u缓存;
公共用户信息FindBySamAccountName(字符串samAccountName)
{
//在_缓存中查找samaccountname,如果未找到
//使用DirectorySearcher从广告中检索信息。
//将信息存储在_缓存中并返回正确的用户。
}
我现在的问题是如何访问这些信息。我曾考虑使用Ninject的ToSingleton,但我怀疑这可能是“每个工作进程的单实例”。因此,缓存可能会是一个更好的地方。但访问对象的最佳方式是什么?具有静态属性的静态类,该类检查对象是否已在缓存中,否则初始化它,然后返回对象


还是有更好的方法解决这个问题?

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

1.
kernel.Bind().To().InSingletonScope().WithConstructorArgument(“根路径”,“LDAP://dc=tessdata,dc=no”);
公共静态MvcHtmlString GetDisplayNameSingleton(此HtmlHelper HtmlHelper,字符串samAccountName)
{
var userRepository=DependencyResolver.Current.GetService();
返回新的MvcHtmlString(userRepository!=null?userRepository.FindByUsername(samAccountName.DisplayName:“Ukjent”);
}
2.
kernel.Bind();
公共静态MvcHtmlString GetDisplayName(此HtmlHelper HtmlHelper,字符串samAccountName)
{
if(HttpRuntime.Cache[“UserRepository”]==null)
{
var newUserRepository=DependencyResolver.Current.GetService();
Add(“UserRepository”,newUserRepository,null,DateTime.MaxValue,
TimeSpan.FromMinutes(20),CacheItemPriority.Default,null);
}
var userRepository=HttpRuntime.Cache[“userRepository”]作为IUserRepository;
返回新的MvcHtmlString(userRepository!=null?userRepository.FindByUsername(samAccountName.DisplayName:“Ukjent”);
}
第二种方法明显更快,尤其是在缓存存储库时第一次调用之后。您也可以更好地控制缓存。第一种方法将保留在内存中,直到应用程序重新启动


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

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

1.
kernel.Bind().To().InSingletonScope().WithConstructorArgument(“根路径”,“LDAP://dc=tessdata,dc=no”);
公共静态MvcHtmlString GetDisplayNameSingleton(此HtmlHelper HtmlHelper,字符串samAccountName)
{
var userRepository=DependencyResolver.Current.GetService();
返回新的MvcHtmlString(userRepository!=null?userRepository.FindByUsername(samAccountName.DisplayName:“Ukjent”);
}
2.
kernel.Bind();
公共静态MvcHtmlString GetDisplayName(此HtmlHelper HtmlHelper,字符串samAccountName)
{
if(HttpRuntime.Cache[“UserRepository”]==null)
{
var newUserRepository=DependencyResolver.Current.GetService();
Add(“UserRepository”,newUserRepository,null,DateTime.MaxValue,
TimeSpan.FromMinutes(20),CacheItemPriority.Default,null);
}
var userRepository=HttpRuntime.Cache[“userRepository”]作为IUserRepository;
返回新的MvcHtmlString(userRepository!=null?userRepository.FindByUsername(samAccountName.DisplayName:“Ukjent”);
}
第二种方法明显更快,尤其是在缓存存储库时第一次调用之后。您也可以更好地控制缓存。第一种方法将保留在内存中,直到应用程序重新启动


不过,我不确定这两种情况下的最佳实践是什么。

当你说“每个工作进程单例”时-您的意思是要在多个web应用程序之间共享此信息缓存吗?当看到您提供的代码片段并知道您使用Ninject时,我的第一反应是使用singleton功能。但是,我问了一个问题,只是为了澄清信息需要走多远(跨请求?跨应用程序?跨服务器?)。此特定缓存将仅在单个web应用程序中使用,但我不确定ninject Singleton是单个应用程序还是单个asp.net从线程池中获取的每个线程。当您说“Singleton per Worker process”时-您的意思是要在多个web应用程序之间共享此信息缓存吗?当看到您提供的代码片段并知道您使用Ninject时,我的第一反应是使用singleton功能。但是,我问了一个问题,只是为了澄清信息需要走多远(跨请求?跨应用程序?跨服务器?)。此特定缓存将仅在单个web应用中使用,但我不确定ninject Singleton是单个应用还是单个asp.net从线程池中获取的每个线程。
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");
}
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");
}