Azure WebJob

时间:2016-01-12 17:54:12

标签: c# azure active-directory azure-webjobs change-password

所以我试图在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;
}

1 个答案:

答案 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(); 方法。

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