在Web API中使用时,PrincipalContext ValidateCredentials对某些用户失败

时间:2016-03-29 00:06:42

标签: c# asp.net-web-api active-directory

我有一个非常奇怪的行为,我想弄明白。

我在IIS下运行的ASP.NET 4.5 Web API用于根据以下代码验证针对Active Directory的用户凭据。

它适用于AD中的某些用户,但对于AD中的其他用户始终返回false。从使用我的自定义messageHandler进行日志记录,我知道它正在进入messageHandler.WriteSuccess部分。所以我知道这不是一个例外。

我使用相同的代码编写了一个Windows窗体桌面应用程序,以便在Web服务器上运行以帮助解决问题,但它会正确验证所有用户。

这让我相信ASP.NET Web API作为网络服务运行可能是一个问题。我更改了应用程序池以使用与登录Web服务器时相同的身份,但它没有任何区别。

为什么完全相同的代码会在Windows窗体应用程序中正确验证用户,但只能在ASP.net Web API中正确验证某些用户。

作为一种解决方法,我让网络管理员为无法登录的用户创建全新的AD用户。这很有效。失败的AD用户和成功的AD用户之间必须存在一些差异。

与运行IIS相比,作为桌面应用程序运行时,相同代码的行为也不同。

任何想法或如何进一步排除故障? 该服务器是Windows Server 2008 R2。

PrincipalContext pc = null;
try
{
    pc = new PrincipalContext(ContextType.Domain, domain);

    var success = pc.ValidateCredentials(username, password);
    if (loggingEnabled)
    {

        messageHandler.WriteSuccess(
            username,
            HistoryLogEntry.OperationType.ActiveDirectory,
            HistoryLogEntry.RequestType.ActiveDirectoryAuthenticate, success.ToString());
    }
    return success;

}
catch (PrincipalServerDownException ex)
{
    var displayMessage = string.Format("Please check your Web Service settings. {0} {1}", ex.Message,
        ex.InnerException == null ? "" : ex.InnerException.Message);

    messageHandler.WriteHistory(
        username,
        HistoryLogEntry.OperationType.ActiveDirectory,
        HistoryLogEntry.RequestType.ActiveDirectoryAuthenticate,
        ex, displayMessage);
    messageHandler.ThrowLastAsHttpError();

    return false;
}
finally
{
    if (pc != null)
    {
        pc.Dispose();
    }
}

1 个答案:

答案 0 :(得分:1)

我的愚蠢错误。

Web服务API将验证凭据方法公开为GET请求。

您必须记住URL编码用户名和密码部分。

特别是密码,因为它可以包含会弄乱查询的值。

密码复杂的人失败了。简单的密码是好的。

编辑:我也在将方法更改为POST,以避免用户忘记或使用错误的编码机制。