繁体   English   中英

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

[英]PrincipalContext ValidateCredentials fails for some users when used in a Web API

我有一个非常奇怪的行为,我想弄清楚。

我有一个在 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();
    }
}

我犯了一个愚蠢的错误。

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

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

尤其是密码,因为它可能包含会使查询混乱的值。

密码复杂的人失败了。 简单的密码就可以了。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM