您的位置:首页 > 编程语言 > ASP

asp.net操作AD的问题

2012-10-17 17:21 316 查看
1、
在ASP.NET中, 启用Windows集成验证,这样我们就有了登陆网页的用户名和密码的哈希版本,但是我们是不能直接使用的,因为是密码的哈希版本,而不是密码本身。

比如:

System.DirectoryServices.DirectoryEntry de = new System.DirectoryServices.DirectoryEntry(


"LDAP://22.11.21.232:389/OU=ou0000_team,OU=ou0000_unit,OU=ou0000_division,DC=bocadtest,DC=com",


"administrator", "admin",System.DirectoryServices.AuthenticationTypes.Secure);

我们不能使用此构造函数来传入用户名和密码,所以只能把此ASP.NET运行线程的安全上下文传递过去,这样的话,我们需要在Web.config中,加入下面的标记:

<authentication mode="Windows" />

<identity impersonate="true"/>

这样的话,就可以把安全上下文传递下去了,使用下面的构造函数:




System.DirectoryServices.DirectoryEntry de = new System.DirectoryServices.DirectoryEntry(


"LDAP://22.11.21.232:389/OU=ou0000_team,OU=ou0000_unit,OU=ou0000_division,DC=bocadtest,DC=com");

这样就可以用用户的权限来操作active directory了。当然如果使用带用户名密码的构造函数也可以,因为用户名和密码已经不起作用。

2、修改密码时,



修改密码应为:

var directoryEntry = new DirectoryEntry(fullPath , adminUser, adminPassword, AuthenticationTypes.Secure);

directoryEntry.Invoke("ChangePassword", new object[] {"alvin_yang","P@ssW0rd1" });
directoryEntry.CommitChanges();

directoryEntry.Close();


必须设置帐号和密码,必须具有管理员权限,原密码也必须设置正确,新密码要满足密码强度策略,不然会出现“出现一个约束冲突”错误。

后来又出现各种报错:“调用的目标发生了异常”、“出现一个约束冲突”等等,我X

下面的出现“出现一个约束冲突”

directoryEntry.Invoke("ChangePassword", new object[] { txtOldPwd.Text, txtNewPwd.Text });

directoryEntry.CommitChanges();

directoryEntry.Close();

下面的又可以:

directoryEntry.Invoke("SetPassword", new object[] { txtNewPwd.Text });

directoryEntry.CommitChanges();

directoryEntry.Close();

尼玛昨天SetPassword不行,ChangePassword可以,今天又反过来了。

“调用的目标发生了异常”:密码强度不够;

出现一个约束冲突:英文缩写超过6个字符也会出现这个错误;

3、启用用户出现如下错误:

该服务器不愿意处理该请求。

说明:执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.DirectoryServices.DirectoryServicesCOMException: 该服务器不愿意处理该请求。

错误原因:启用代码发错位置了,应该在设置密码之后

错误代码:

DirectoryEntry usr = ou.Children.Add("CN=" + commonName, "user");

//usr.Properties["userAccountControl"].Value = 512 | 66048;//这里出现异常:该服务器不愿意处理该请求

usr.Properties["samAccountName"].Value = sAMAccountName;

usr.Properties["telephoneNumber"].Value = "15014088110";

usr.Properties["streetAddress"].Value = "深圳南山";

usr.CommitChanges();

//1.

usr.Invoke("ChangePassword", new object[] {null, "P@ssw0rd" });

//2.

usr.Invoke("SetPassword", new object[] { "P@ssw0rd" });

usr.CommitChanges();

正确代码:

DirectoryEntry usr = ou.Children.Add("CN=" + commonName, "user");

usr.Properties["samAccountName"].Value = sAMAccountName;

usr.Properties["telephoneNumber"].Value = "15014088110";

usr.Properties["streetAddress"].Value = "深圳南山";

usr.CommitChanges();

//1.

//usr.Invoke("ChangePassword", new object[] {null, "P@ssw0rd" });

//2.

usr.Invoke("SetPassword", new object[] { "P@ssw0rd" });

usr.Properties["userAccountControl"].Value = 512 | 66048;

usr.CommitChanges();

4、添加用户时,设置密码有两种方式:

DirectoryEntry usr = ou.Children.Add("CN=" + commonName, "user");

usr.Properties["samAccountName"].Value = sAMAccountName;

usr.Properties["telephoneNumber"].Value = "15014088110";

usr.Properties["streetAddress"].Value = "深圳南山";

usr.CommitChanges();

//1.

//usr.Invoke("ChangePassword", new object[] {null, "P@ssw0rd" });

//2.

usr.Invoke("SetPassword", new object[] { "P@ssw0rd" });

usr.CommitChanges();

5.未指定的错误

LDAP 路径缺少 LDAP 协议标识符。确保路径中包含 LDAP 协议标识符以大写形式

6.拒绝访问

7、指定的目录对象无法与远程资源链接

8、出现了一个操作错误

异常详细信息: System.DirectoryServices.DirectoryServicesCOMException: 出现了一个操作错误。

IIS跟AD服务器不在同一个域

9、未经授权:访问由于凭据无效被拒绝。

解决方法1:IIS-身份验证-匿名身份验证使用特定用户(具有管理员权限);

解决方法2:IIS-身份验证-启用基本身份验证,这样进行操作时会弹出框提示数据帐号、密码(具有管理员权限)

解决方法3:新建应用程序池,右键新建的应用程序池-属性,进程模型-标识-自定义账户,设置具有管理员权限的用户,IS-身份验证-匿名身份验证-启用应用程序池标识

第三种方法最好使,其他站点身份验证匿名身份验证直接启用引用程序池标识。

第6、8点问题应该也是这种解决方法。

10、添加用户时:该服务器不愿意处理该请求

当 只勾选密码永不过期时,设置密码应在设置userAccountControl、pwdLastSet属性前。

11、AD的密码策略(大于6-7个字符,字母、数字、特殊字符组的组合)








                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: