ネットワーク内のユーザーが一部のリソースを表示できるようにする ASP.NET MVC4 を使用して、単純なイントラネット アプリケーションを構築しました。アプリケーションは、主に ExtJS および WebAPI コントローラーで構築されています。
私の承認は Active Directory に基づいています。
コードをデバッグしていると、AD 呼び出しを複数回実行していることに気付きました。これが私のADヘルパークラスです:
public class AD
{
public static string CurrentUser = "";
public static string GetCurrentUserLogin()
{
return HttpContext.Current.User.Identity.Name.Split('\\')[1];
}
public static Employee GetCurrentUser()
{
var login = CurrentUser == "" ? GetCurrentUserLogin() : CurrentUser ;
return GetUser(login);
}
public static Employee GetCurrentUser(string login)
{
return GetUser(login);
}
public static Employee GetUser(Guid guid)
{
using (var entry = new DirectoryEntry("LDAP://wawa.firma.pl/OU=IT,DC=wawa,DC=firma,DC=pl", @"AD_client", "xyzabc"))
{
using (var searcher = new DirectorySearcher(entry))
{
byte[] bytes = guid.ToByteArray();
var sb = new StringBuilder();
foreach (byte b in bytes)
{
sb.Append(string.Format(@"\{0}", b.ToString("X2")));
}
searcher.Filter = String.Format("(&(objectClass=User)(objectCategory=Person)(objectguid={0}))", sb);
searcher.PropertiesToLoad.Add("description");
searcher.PropertiesToLoad.Add("objectguid");
searcher.PropertiesToLoad.Add("SN");
searcher.PropertiesToLoad.Add("givenName");
searcher.PropertiesToLoad.Add("name");
searcher.PropertiesToLoad.Add("manager");
searcher.PropertiesToLoad.Add("mail");
searcher.PropertiesToLoad.Add("sAMAccountName");
searcher.PropertiesToLoad.Add("telephoneNumber");
searcher.PropertiesToLoad.Add("directReports");
searcher.SizeLimit = 1;
searcher.SearchScope = SearchScope.Subtree;
try
{
SearchResult result = searcher.FindOne();
if (result == null) return null;
var emp = ParseSearchResult(result);
emp.fullAccess = true;
return emp;
}
catch (Exception)
{
return null;
}
}
}
}
}
これは正常に機能しますが、現在のユーザー ID を取得する必要があるたびに、次のように呼び出します。
var user_id = AD.GetCurrentUser().Id;
私の問題は、AD に保存されているユーザーのプロパティを要求するたびに、新しい AD 呼び出しを行う必要があることです。理想的には、(現在のユーザーに対して) 単純な呼び出しを 1 回実行して保存し、何かが必要になるたびにローカル オブジェクトから取得したいと考えています。
WebAPIコントローラーのセッションに関する記事をいくつか読みました。しかし、キャッシュを使用した素晴らしい例も見つかりました: https://github.com/filipw/AspNetWebApi-OutputCache
ただし、セッションはユーザーごと、キャッシュはアプリケーションごとです。
ユーザーごとに ActiveDirectory の結果を保存する最良の方法は何ですか? これらの変数を保持するには、AD クラスをどのように変更すればよいですか。
最も簡単な方法は、次のように結果をセッションに保存することです。
public static Employee GetUser(Guid guid)
{
var e = HttpContext.Current.Session[guid.ToString()] as Employee;
if (e == null)
{
//get user from AD
//store in session
}
return e;
}
この方法では、AD に 1 回だけクエリを実行できますが、n 分ごとに再クエリを実行することはできません (キャッシュにはタイムアウトがあります)。
これをより簡単に/より良くするにはどうすればよいですか? これを行う他の方法はありますか?