UserPrincipal.SetPassword Azure WebJob 拒绝访问

UserPrincipal.SetPassword Access Denied in Azure WebJob

所以我正在尝试更改 AD 中用户的密码。我有一个具有 AD 角色的 VM 运行ning server 2008(这只是为了测试目的。当这个 webapp 上线时将连接到一个内部部署的 AD 服务器),以及一个在同一个 Vnet 中有一个 webjob 的 Azure WebApp .

当我在我的机器上 运行 来自 visual studio 的网络作业时,它按预期工作。但是当我 运行 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;
}

是的,这很可能是 Azure WebApp 沙盒问题。有关沙盒限制的详细信息,请参见 in the wiki here. That wiki doesn't explicitly call out the API you're attempting to use, but as indicated in another SO post 相同 UserPrincipal.SetPassword API,即 API 导致调用 [SecurityCritical] 方法的调用堆栈。

恐怕您很可能必须找到另一种方法来完成您的方案。