我有一个非常奇怪的行为,我想弄明白。
我在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();
}
}
答案 0 :(得分:1)
我的愚蠢错误。
Web服务API将验证凭据方法公开为GET请求。
您必须记住URL编码用户名和密码部分。
特别是密码,因为它可以包含会弄乱查询的值。
密码复杂的人失败了。简单的密码是好的。
编辑:我也在将方法更改为POST,以避免用户忘记或使用错误的编码机制。