c# - PrincipalContext.ValidateCredentials 对某些用户失败?
问题描述
我有以下代码:
public void AuthenticateActiveDirectoryAccount(string username, string password)
{
PrincipalContext context;
var envSettings = _settingsService.GetGlobalSetting<EnvironmentSettings>().Props;
string ADServer = envSettings.ActiveDirectory.ServerURI;
string ADUserName = envSettings.ActiveDirectory.Username;
string ADUserPassword = envSettings.ActiveDirectory.Password;
string account = null;
account = username.ToLower();
if (ADUserName.Length > 0)
context = new PrincipalContext(ContextType.Domain, ADServer, ADUserName, ADUserPassword);
else
context = new PrincipalContext(ContextType.Domain, ADServer);
using (context)
{
if (!context.ValidateCredentials(account, password))
{
throw new Exception();
}
}
}
这对大多数用户都很有效,但有些用户会遇到以下异常:
服务器不处理目录请求:System.DirectoryServices.Protocols.ErrorChecking.CheckAndSetLdapError(Int32 错误)\r\n vid System.DirectoryServices.Protocols.LdapSessionOptions.FastConcurrentBind()\r\n vid System.DirectoryServices.AccountManagement.CredentialValidator。 BindLdap(NetworkCredential creds, ContextOptions contextOptions)\r\n vid System.DirectoryServices.AccountManagement.CredentialValidator.Validate(String userName, String password)\r\n vid System.DirectoryServices.AccountManagement.PrincipalContext.ValidateCredentials(String userName, String password)
首先,我认为失败的用户没有调用 AD 的权限,但我确定 AdServer、AdUserName 和 AdUserPassword 是使用应该有权访问的全局 AD 帐户设置的。
为什么有些用户会得到这个异常?
解决方案
将 ValidateCredentials 更改为此可以解决问题:
context.ValidateCredentials(account, password, ContextOptions.Negotiate | ContextOptions.Signing | ContextOptions.Sealing)
然而,这可能仍然是 Active Directory 帐户的安全问题。
推荐阅读
- swift - 如何正确处理多个 if else 条件?
- mysql - 为什么我超出了双范围被破坏的范围错误?
- ios - Coredata 获取请求结果在每次请求后翻倍
- python - 无法在模板上显示数据库中的数据
- powershell - 为没有管理员权限的 CurrenUser/LocalMachine 安装证书?
- blender - 根据搅拌机中的光线使物体消失
- c# - 使用 Unity 绘图应用程序
- google-cloud-platform - 如何为 Cloud Run on GKE 服务设置最小规模?
- c# - HttpClient ReadAsStringAsync 舍入小数
- angular6 - 相对路由在 canActivate 防护中不起作用