0

ネットワーク内のユーザーが一部のリソースを表示できるようにする 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 分ごとに再クエリを実行することはできません (キャッシュにはタイムアウトがあります)。

これをより簡単に/より良くするにはどうすればよいですか? これを行う他の方法はありますか?

4

1 に答える 1