- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个 MVC 应用程序需要根据 Active Directory 登录和验证用户。我正在使用 PrincipalContext.ValidateCredentials
方法,但始终获得 false
的身份验证。
连接到服务器没问题。问题似乎出现在 ValidateCredentials
中。
这是我的代码:
public static bool IsAuthenticated(string domain, string username, string pwd) {
bool IsAuthenticated = false;
try {
PrincipalContext insPrincipalContext =
new PrincipalContext(ContextType.Domain, domain, "DC=c1w,DC=com");
username = "c1w\\" + username;
IsAuthenticated = insPrincipalContext.ValidateCredentials(username, pwd);
}
catch (Exception ex)
{
// Rethrow this exception
ExceptionPolicy.HandleException(ex, "Exception Policy");
}
return IsAuthenticated;
}
有人知道为什么会这样吗?
最佳答案
ValidateCredentials(string, string)
的工作原理如下:首先,它尝试使用 Negotiate
、Signing
和 进行身份验证密封
上下文选项。如果失败,它会再次尝试使用 SimpleBind
和 SecureSocketLayer
。
问题是 NT4(又名“遗留”,又名“下层名称”)格式(DOMAIN\UserName
,或者更准确地说,NetBiosName\SamAccountName
) 不适用于协商。但它确实适用于 SimpleBind。
那么在调用 2 参数 ValidateCredentials()
方法时可能发生的情况是,它首先使用 Negotiate 失败,因为它不喜欢 NT4 格式,然后在使用简单绑定(bind)时再次失败.
在我自己的测试中,我发现即使在回退到使用简单绑定(bind)后它仍然失败的原因是它不仅使用了 SimpleBind。它使用 SimpleBind
加上 SecureSocketLayer
。这意味着如果 Active Directory 服务器未正确设置为使用 SSL(测试环境的常见场景),它仍然会失败。
正如其中一条评论中提到的,您永远、永远不想单独使用 SimpleBind
(没有 SecureSocketLayer
),否则您的密码将通过网络发送纯文本。
在野外,我看到一些 Active Directory 系统根本不允许使用简单绑定(bind),因此您必须使其与协商一起使用。
我找到了两种方法来处理这个问题:
1) 如果一切都发生在同一个域中,您应该能够仅使用用户名(SAM 帐户名称)调用 ValidateCredentials
,而忽略“DOMAIN\”部分。然后,它将在第一次与 Negotiate 一起正常工作。
2) 如果域部分很重要,因为可能涉及多个域(即 Domain1\UserA
和 Domain2\UserA
是不同的人),那么它会得到一个有点复杂。在这种情况下,我最终要做的是将 NT4 名称 (DOMAIN\User) 转换为“用户主体名称”格式(例如 LogonName@domain.com
)。有几种不同的方法可以做到这一点。最简单的可能是使用 UserPrincipal.FindByIdentity()
的 3 参数重载,然后在结果中获取 UserPrincipalName
属性的值。另一种方法是使用 DirectorySearcher
并在 LDAP://domain
中查询具有匹配 sAMAccountName 的用户的
值。注意:此解决方案仅在涉及的所有域都在同一个林中时才有效。userPrincipalName
属性
关于c# - PrincipalContext.ValidateCredentials 总是返回 FALSE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2363620/
首先,我查看了关于 SO 的大多数问题,但似乎都不是完全相同的问题。 Here是一个类似的问题,但并不完全相同。在我的情况下,我正在创建一个 PrincipalContext : Dim pctx A
我在使用 PrincipalContext.ValidateCredentials 时看到一些奇怪的行为。该设置是父/子设置中的两个 Active Directory 域(因此我们有主域 compan
我必须实现一个安全解决方案,根据 ldap/AD 服务器验证用户凭据。 代码是这样的…… using (PrincipalContext context = new PrincipalContext(
我有一个包含 Login 的 WCF 服务根据本地计算机凭据验证用户名和密码的方法,在看似随机的一段时间后,它将停止对某些用户起作用。 实际的登录命令是这样的: public UserModel Lo
我有一个 MVC 应用程序需要根据 Active Directory 登录和验证用户。我正在使用 PrincipalContext.ValidateCredentials 方法,但始终获得 false
我们的应用程序有一个登录框,要求用户输入他们的 AD 凭据。我们获取这些凭据,然后调用 using (PrincipalContext pc = new PrincipalContext(Co
我正在处理两个域 - 一个是可信域。一个域上可能有一个 JohnSmith,另一个域上可能有另一个 JohnSmith。这两个人都需要登录我的应用程序。 我的问题:无论我传入哪个域都没有关系 - 此代
我在安装过程中使用 Windows PowerShell 查询和验证用户的 Windows 凭据。直到昨天,它都运行良好。现在我公司的 IT 部门更改了域 Controller 的一些配置,现在我得到
我已经通过覆盖各种类/方法设法更改了代码中的密码字段。但是我在尝试覆盖 EloquentUserProvider 和它的 validateCredentials() 方法后,我不断收到错误 - Err
我创建了一项服务,该服务使用 System.DirectoryServices.AccountManagement 根据 Active Directory 验证凭据。我需要针对本地域和受信任的域验证凭
我正在尝试在我的 MVC 应用程序中使用 AD LDS 进行用户身份验证。我已经设法编写了一些允许我创建/编辑/删除用户和组的代码,但我似乎无法对它们进行身份验证。这是我的示例代码: using( v
我有以下代码片段来针对 AD 测试纯文本用户名/密码,如果我在 visual studio 中按 F5 并通过 WCFTestClient 尝试它,它工作正常,但是一旦我部署到 IIS 并尝试相同的功
我有一个应用程序,其中用户对我们的 Active Directory 进行身份验证: private bool Authenticate() { using (var context = n
我有一个现有项目使用以下内容在开发机器上进行本地身份验证 principalContext.ValidateCredentials("bondjames", "drno", ContextOption
我正在使用 IIS 6.0 托管 WCF Web 服务。我的应用程序池在本地管理员帐户下运行,并且我定义了其他本地用户来访问 Web 服务。我编写了以下代码来验证用户: //Any public st
我正在使用 PrinciaplContext.ValidateCredentials 来针对本地计算机验证一组凭据: string account = Context.ReadLine(); stri
最初问题始于 .NET\C# 和 ValidateCredentials方法 - 没有 SSL 它工作,使用 SSL 它返回“服务器无法处理目录请求”。但我缩小了范围并简化为下面发布的 C++ 代码。
在我的 LoginController 中的 Auth 下,我使用了以下代码: namespace App\Http\Controllers\Auth; use App\Model\Admin; us
我是一名优秀的程序员,十分优秀!