1

AD情報のユーザー権限を要求する.NETWebサービスからのWebメソッドに関する奇妙な「バグ」に何時間も費やしました。

良いニュースは、バグを修正したことですが、修正が効果的である理由は理解できます。

バグのあるWebメソッドは次のとおりです。

public bool ValidateTask(string originatingUser)
{
    SPUserToken userToken = null;

    // get the System account for impersonation
    string userToken = site.SystemAccount.UserToken; 
    using (SPSite rootSite = new SPSite(site.ID, userToken)) 
    {
        using (SPWeb web = rootSite.OpenWeb()) 
        {
            // get the domain name of the application pool of the web app
            string servicesDomain = 
                StringUtilities.GetDomain(site.WebApplication.ApplicationPool.ManagedAccount.Username);
            // get the domain name of the user
            string accountsDomain = StringUtilities.GetDomain(originatingUser);

            PrincipalContext ServicesDomainContext = 
                new PrincipalContext(ContextType.Domain, servicesDomain);
            PrincipalContext AccountsDomainContext = 
                new PrincipalContext(ContextType.Domain, accountsDomain);

            // COMException when the FindByIdentity is called because 
            // AccountsDomainContext.connectedServer throw exception
            using (UserPrincipal usr = 
                UserPrincipal.FindByIdentity(AccountsDomainContext, IdentityType.SamAccountName, originatingUser))
            {
            // get user groups memberships
            }
        }
        // check groups memberships and return the true or false
    }
}

修正を加えたWebメソッドは次のとおりです。

public bool ValidateTask(string originatingUser)
{
    SPSecurity.RunWithElevatedPrivileges(
        delegate ()
        {
            ...
            using (SPSite rootSite = new SPSite(site.ID))
            {
                using (SPWeb web = rootSite.OpenWeb())
                {
                    // get the domain name of the application pool of the web app
                    string servicesDomain = 
                        StringUtilities.GetDomain(site.WebApplication.ApplicationPool.ManagedAccount.Username);
                    // get the domain name of the user
                    string accountsDomain = StringUtilities.GetDomain(originatingUser);

                    PrincipalContext ServicesDomainContext = 
                        new PrincipalContext(ContextType.Domain, servicesDomain);
                    PrincipalContext AccountsDomainContext = 
                        new PrincipalContext(ContextType.Domain, accountsDomain);

                    using (UserPrincipal usr = 
                        UserPrincipal.FindByIdentity(AccountsDomainContext, IdentityType.SamAccountName, originatingUser))
                    {
                    // get user groups memberships
                    }
                }
            }

           // check groups memberships and return the true or false
        }
    ); // end of delegate method
}

================================================== =========================

SharePointでは、ImpersonationとRunWithElevatedPrivilegeで同じ結果が得られると思いました。だから私の質問は次のとおりです。

1-では、なぜRunWithElevatedPrivilegeが機能するのですか?

2- WebMethodコンテキストで特権を昇格させるときの資格情報は何ですか?これはSharePointWebサービスルートのIDプールアカウントですか?

3- 2つの方法の資格を追跡できますか?

4

1 に答える 1

1

RunWithElevatedPrivileges は、内部のコードを新しいスレッドで実行します。この新しいスレッドは、現在のアプリケーション プールのアカウントで実行されます。たとえば、http://localhost/_vti_bin/yourserviceの下で呼び出すと、アプリケーション プールはポート 80 の Web アプリケーションのアプリケーションになります。ユーザー トークンを使用して新しい SPSite を使用すると、定義されたユーザーのコンテキストで SPSite のみが開かれます。新しいスレッドを開始しません。WindowsIdentity.Current を呼び出すことで、現在のユーザーを追跡できます。

于 2012-05-08T08:12:49.920 に答える