2

イントラネット アプリケーションを構築しており、Windows 認証を使用しています。私はこのセットアップと作業を行っており、@Context.User.Identity.Name を介して現在のユーザーのユーザー名を確認できます。

Active Directory にクエリを実行して、表示名、電子メール アドレスなどを取得したいと考えています。

私は System.DirectoryServices.AccountManagement を見て、これから基本的な例を作成しました。ただし、アプリケーション全体でこの情報を表示する方法については明確ではありません。

私がこれまでに持っているものは次のとおりです。

public class searchAD
{

    // Establish Domain Context
    PrincipalContext domainContext = new PrincipalContext(ContextType.Domain);

    public searchAD()
    {
        // find the user 
        UserPrincipal user = UserPrincipal.FindByIdentity(domainContext, HttpContext.Current.User.Identity.Name);

        if (user != null)
        {
            var userGuid = user.Guid;
            var DisplayName = user.DisplayName;
            var GivenName = user.GivenName;
            var EmailAddress = user.EmailAddress;
        } 

    }

}

そのようにViewModelを作成する必要があると思いますか?

public class domainContext
{
    public Nullable<Guid> userGuid { get; set; }
    public string DisplayName { get; set; }
    public string GivenName { get; set; }
    public string EmailAddress { get; set; }
}

アプリケーションのさまざまなセクションでこの情報にアクセスできるようにしたいと考えています。

エラーが発生していません。これらすべてを結び付ける何かが欠けているようです。

4

1 に答える 1

4

Windows ID の部分がありません。また、使用している AD オブジェクトを破棄することを忘れないでください。

public class AdLookup
{
    public static DomainContext GetUserDetails()
    {
        using (PrincipalContext pc = new PrincipalContext(ContextType.Domain))
        {
            IPrincipal principal = HttpContext.Current.User;
            WindowsIdentity identity = ((WindowsIdentity)principal.Identity);
            UserPrincipal user = UserPrincipal.FindByIdentity(pc, identity.Name);

            if (principal != null)
            {
                return new DomainContext() {
                    userGuid = user.Guid,
                    DisplayName = user.DisplayName,
                    GivenName = user.GivenName,
                    EmailAddress = user.EmailAddress
                };
            }
        }

        return null;
    }
}

アプリケーション内の誰もがこれにアクセスできるようにする最善の方法は、他のすべてのコントローラーが継承する「BaseController」というクラスを作成し、このコードをそこに (理想的には DomainContext というプロパティとして) 配置することです。

アプリケーション全体でこれを使用するには、ベース コントローラーにメソッドを追加して、この情報を ViewData に追加することもできます。

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    base.OnActionExecuted(filterContext);
    ViewData["BaseController_DomainContext"] = AdLookup.GetUserDetails();
}

次に、次を使用して、この任意の継承コントローラーからレンダリングされた任意のビューでこれにアクセスできます。

@{
    DomainContext domainContext = (DomainContext)ViewData["BaseController_DomainContext"];
}

Welcome back: @domainContext.DisplayName

もちろん、null で問題が発生することもありますが、GetUserDetails メソッドで何らかのダミーの DomainContext を使用して処理できます。

これは 1 つの方法にすぎません。代わりに、すべてのビュー モデルが継承するベース ビュー モデルを作成し、ビュー内で直接アクセスすることもできますが、複雑さを追加しないため、この方法の方が簡単であることがわかりました。ビューモデルに。

于 2012-07-02T14:22:36.203 に答える