C# MVC3应用程序中的多个Active Directory查找
我的MVC应用程序允许一部分用户在表中插入/编辑记录,由于我使用的是Windows身份验证,我可以“免费”获取他们的SAMAccountName,并可以将其插入到所述记录的“Last Updated By”字段中 我的应用程序中最重要(也是最常用)的视图之一将显示每页50-100条记录的列表,但我不想显示它们的SAMAccountName。我希望从Active Directory中获得更为用户友好的显示名称 我在这里看到过几篇文章建议将广告链接到SQL,但这需要在SQL server上安装组件,我不希望这样做。相反,我考虑创建以下接口和派生类: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上安装组件,
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");
}