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つの方法の資格を追跡できますか?