所以我试图在AD中更改用户的密码。我有一个运行带有AD角色的服务器2008的VM(仅用于测试目的。此实时此webapp将连接到本地AD服务器),以及在同一Vnet中具有webjob的Azure WebApp。
当我在我的机器上从visual studio运行webjob时,它按预期工作。但是,当我在Azure中运行webjob时,它会获得Access is Denied异常。
所以不知何故,当它在Azure中运行时,不会使用给该方法的标识。它可能使用了App Pool中的默认标识,但由于它是WebApp,我无法更改App Pool中的标识,因为WebApps在沙盒环境中运行。
我也尝试过使用模拟功能,这种模拟也无效,但仍然拒绝访问。
有什么想法吗?
由于
代码:
//The credentials of an admin service account in AD which are retrieved from a config file
private static string strUsername;
private static string strPassword;
//The domain name of the AD server, also from config
private static string strDomain;
static void Main(string[] args)
{
try
{
string mess;
//Password here just for testing purposes
SetUserPassword("pname@domain.com", "newP45sword", out mess);
}
catch (Exception ex)
{
Console.WriteLine("Error..." + ex);
}
}
public static void SetUserPassword(string sUserName, string sNewPassword, out string sMessage)
{
try
{
UserPrincipal oUserPrincipal = GetUser(sUserName);
oUserPrincipal.SetPassword(sNewPassword);//This is where the exception occurs
sMessage = "";
}
catch (Exception ex)
{
Console.WriteLine("Err." + ex);
}
}
public static PrincipalContext GetPrincipalContext()
{
//Here is where the admin credentials are passed to the app
PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Domain, strDomain, strUsername, strPassword);
return oPrincipalContext;
}
public static UserPrincipal GetUser(string sUserName)
{
PrincipalContext oPrincipalContext = GetPrincipalContext();
UserPrincipal oUserPrincipal = UserPrincipal.FindByIdentity(oPrincipalContext, sUserName);
return oUserPrincipal;
}
答案 0 :(得分:0)
是的,这很可能是Azure WebApp Sandbox问题。有关沙盒限制的详细信息,请参见in the wiki here。该wiki没有明确地调出您尝试使用的API,但正如another SO post中针对相同的[SecurityCritical]
API所示,该API会导致调用堆栈调用select distinct user
from t
where `update` >= curdate();
方法。
您很可能必须找到另一种方法来完成您的方案,我很害怕。