1.手動獲取域帳號和密碼進行驗證 html
public class VerifyADDomain { node
@SuppressWarnings("unchecked")
public int verifyADbyUser(String name, String password) {
int isLogin = -2;//isLogin=0 驗證經過
// 讀取資源文件
// String host = "10.2.1.17"; // AD服務器
// String port = "389"; // 端口
String url = PropertyManager.getValue("ad_ldap_url").trim();
// String adminName = "hn.net\\" + name; // 注意用戶名的寫法:domain\\User
String adminName = name + "@"
+ PropertyManager.getValue("ad_domain_name");
// 域節點
// String searchBase = "DC=hn,DC=net";
// LDAP搜索過濾器類
// String searchFilter = "(&(mail=" + name + "@cbhb.com.cn))";
String enable = PropertyManager.getValue("ad_enable");
if (enable == null || !enable.trim().toLowerCase().equals("true")) {
isLogin = -2;
return isLogin;
}
// searchBase = PropertyManager.getValue("ad_search_base_node");
// searchFilter = PropertyManager.getValue("ad_search_filter");
// searchFilter = searchFilter.replaceAll("username", name);
// 定義返回數據的屬性
// String returnedAtts[] = { "cn", "department" };
// String returnedAtts[] = { "name", "departmentNumber", "department",
// "mail" };
Hashtable<String, String> HashEnv = new Hashtable<String, String>();
HashEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); // LDAP訪問安全級別
HashEnv.put(Context.SECURITY_PRINCIPAL, adminName); // AD User
HashEnv.put(Context.SECURITY_CREDENTIALS, password); // AD Password
HashEnv.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory"); // LDAP工廠類
HashEnv.put(Context.PROVIDER_URL, url);
LdapContext ctx = null;
try {
ctx = new InitialLdapContext(HashEnv, null);
System.out.println("驗證經過");
isLogin = 0;
// // 搜索控制器
// SearchControls searchCtls = new SearchControls(); // Create the
// searchCtls.setTimeLimit(1000);
// // 建立搜索控制器
// searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE); //
// Specify
// // Specify the search scope 設置搜索範圍
// searchCtls.setReturningAttributes(returnedAtts); // 設置返回屬性集
// // 根據設置的域節點、過濾器類和搜索控制器搜索LDAP獲得結果
// searchFilter = null;
// NamingEnumeration answer = ctx.search(searchBase,
// searchFilter,searchCtls);// Search for objects using the filter
// //建立用戶對象
// icUser=new IcUser();
// //icUser.setLoginName(name);
// //icUser.setPwd(password);
// while (answer.hasMoreElements()) {// 遍歷結果集
// SearchResult sr = (SearchResult) answer.next();// 獲得符合搜索條件的DN
// Attributes Attrs = sr.getAttributes();// 獲得符合條件的屬性集
// if (Attrs != null) {
// for (NamingEnumeration ne = Attrs.getAll(); ne.hasMore();) {
// Attribute Attr = (Attribute) ne.next();// 獲得下一個屬性
// // 讀取屬性值
// if (Attr.getID().toString().equals("name")) {
// for (NamingEnumeration e = Attr.getAll(); e
// .hasMore();) {
// //icUser.setDisplayName(e.next().toString());
// }
// }
// if (Attr.getID().toString().equals("mail")) {
// for (NamingEnumeration e = Attr.getAll(); e
// .hasMore(); ) {
// //icUser.setEmail(e.next().toString());
// }
// }
// if (Attr.getID().toString().equals("department")) {
// for (NamingEnumeration e = Attr.getAll(); e
// .hasMore(); ) {
// //icUser.setDepartmentName(e.next().toString());
// }
// }
// if (Attr.getID().toString().equals("departmentNumber")) {
// for (NamingEnumeration e = Attr.getAll(); e
// .hasMore(); ) {
// //icUser.setDepartmentCode(e.next().toString());
// }
// }
// }
// }
// }
} catch (NamingException e) {
e.printStackTrace();
System.err.println("AD驗證失敗 : 用戶名:" + name);
isLogin = -2;
} finally {
try {
if (ctx != null) {
ctx.close();
}
} catch (NamingException e) {
e.printStackTrace();
}
}
return isLogin;
} 安全
配置參數:
ad_enable=true
ad_ldap_url=ldap://10.2.1.17:389
ad_domain_name=hn.net
ad_search_base_node=DC\=hn,DC\=net
ad_search_filter=(&(mail\=username@cbhb.com.cn)) 服務器
2.利用jcifs-1.3.17.jar,配置過濾器,自動驗證 網絡
<filter>
<filter-name>NtlmHttpFilter</filter-name>
<filter-class>jcifs.http.NtlmHttpFilter</filter-class>
<init-param>
<param-name>jcifs.http.domainController</param-name>
<param-value>10.2.1.17</param-value>
</init-param>
<init-param>
<param-name>jcifs.smb.client.domain</param-name>
<param-value>hn.net</param-value>
</init-param>
<init-param>
<param-name>jcifs.smb.lmCompatibility</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>jcifs.smb.client.useExtendedSecurity</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>jcifs.smb.client.soTimeout</param-name>
<param-value>500</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>NtlmHttpFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
app
此方法是不支持NTLM2協議,而當客戶端是WIN7系統時,默認採用的是NTLM2協議,所以須要手動進行設置。在 管理工具->本地安全策略->本地策略->安全選項,將 網絡安全:LAN Manager 身份驗證級別 屬性改成LM & NTLM - 若是已協商,使用NTLMv2 會話安全。 dom
3. 使用IIS服務器進行驗證 工具
安裝IIS 6.0及.NET Framework 3.5,在網站->屬性->目錄安全性,取消 啓用匿名訪問,勾選 Windows域服務器的摘要式身份驗證,再下面的 領域 中選擇計算機所在域名。而後將下面的aspx文件放入網站,經過該aspx頁面獲取登陸用戶的用戶名,再跳轉到須要訪問的系統頁面。 網站
Default.aspx頁面 url
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Redirect Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Response.Write("正在跳轉 ...."); if ((System.Web.HttpContext.Current.Session["Account"] == null) | (System.Web.HttpContext.Current.Session["dtSec"] == null) | (System.Web.HttpContext.Current.Session["dtJiYao"] == null)) { //取得用戶姓名並刪除域信息 //string strAcctEname = String.Empty; string strUserEname = System.Web.HttpContext.Current.User.Identity.Name; int ilen = strUserEname.IndexOf('\\', 0); strUserEname = strUserEname.Substring(ilen + 1, strUserEname.Length - ilen - 1); Response.Redirect("須要訪問的系統地址"); } } }