asp.net网站采用Windows集成身份认证,浏览器采用IE,弹出windows输入密码对话框,
现在服务端需要自定义身份认证,不使用IIS提供的验证。
现在的问题是:
1:服务端如何取得IE提交的用户身份信息。
2:取得的这个信息,如何结合LDAP来实现认证。
3:如果认证通过,怎么可以把凭据传递给Asp.Net应用。
楼主要认证模式还是Forms?参考这个,.Net 一般查MSDN都能找到解决方法,MSDN现在更强大了!
http://msdn.microsoft.com/zh-cn/library/ms180890(v=vs.80).aspx
等待高手···
这篇文章是很赞,但这个是进入Asp.Net后的事情,WindowsAuthtication是IIS干的事情,这个时候,Asp.net还没有参与,也没有资格参与。
我需要的是替换IIS提供的验证provider。应该说,这不是Asp.net层面的事情。
楼主 可以采用 luofer 提供的MSDN方法 我写的域集成验证一直采用Ldap来验证
客户端必须用windows验证,不是自定义form。
目前看来,这里恐怕找不到答案。
@Alvin: 开启windows验证,然后再页面当初始化时候 获取当前登录页面的Windows用户,去域数据库里面的域账户匹配。如果匹配成功,根据权限加载不同的菜单。如果不成功跳转到自定义提示页面,提示需要需要相应的权限(至于密码错误的情况下,IIS自动回去域匹配,如果错误页面不会初始化的)。不知道符合你的需要吗?
以前做过一个这样的项目 开启Windows验证,但是验证是在数据库的 (密码不在数据库)。
@-Bei-:
如何实现的,是否使用了ISAPI Filter?愿闻其详,多谢了!
@Alvin: 我说下大概的过程吧,就是你写一个PageBase,然后再页面PageLoad事件之前加上 获取当前用户 的登录 :
1 public class PageBase : Page 2 { 3 protected virtual void Page_Load(object sender, EventArgs e) 4 { 5 //获取当前登录用户 6 Users currentUser = this.UserAccount; 7 Authentication();//判断是否有权限 8 9 if (!IsPostBack) 10 { 11 //PostBack 12 } 13 } 14 public virtual Users UserAccount 15 { 16 get 17 { 18 if (Session["CurrentUser"] == null) 19 { 20 21 Model.Users user = null; 22 bool isWindowsLogin = false; 23 //判读是否是设置了Windows验证 24 if (ConfigurationManager.AppSettings["WindowsAuthentication"] != null) 25 { 26 isWindowsLogin = (ConfigurationManager.AppSettings["WindowsAuthentication"].ToString().ToLower() == "true"); 27 } 28 if (isWindowsLogin) 29 { 30 string domainAccount = Request.ServerVariables["LOGON_USER"]; 31 //string domainAccount = this.User.Identity.Name; 32 ///根据当前登录用户判断与域账户是否在数据库存在 33 user = new BLL.Users().GetModelByDomainAccount(domainAccount); 34 } 35 //测试需要 36 //else 37 //{ 38 // int userId = 1; 39 // user = new BLL.Users().GetModel(userId); 40 //} 41 42 if (user != null) 43 { 44 Session["CurrentUser"] = user; 45 //默认首页 46 BLL.Permission bll = new Permission(); 47 //获取当前用户的自定义默认首页 48 string url = bll.GetUrlByID(user.FirstPage); 49 //判断是否有权限进入默认页面 50 if (CheckPermission(WebUtility.GetCurrenCodeByUrl(url))==false) 51 { 52 HttpContext.Current.Response.Redirect("/Default.aspx", true); 53 } 54 HttpContext.Current.Response.Redirect("/" + url, true); 55 56 } 57 else 58 { 59 // 跳转到登录页面,或者未登录提示页面。 60 HttpContext.Current.Response.Redirect("/NoPermission.aspx", true); 61 } 62 } 63 else 64 { 65 Users currentUser = Session["CurrentUser"] as Users; 66 Session["CurrentUser"] = currentUser; 67 } 68 69 return Session["CurrentUser"] as Users; 70 } 71 72 set 73 { 74 Session["CurrentUser"] = value; 75 } 76 } 77 } 78
@-Bei-:
感谢提供代码!
但我这边的需求是接管IIS的身份验证,从ISAPI中取得用户提交的信息,这个时候和Asp.Net没有关系。
@Alvin: 这里就是IIS接管了身份验证,Asp.net只是去加载页面访问权限。如果没有权限加载会看到所有菜单的。
IIS的各种身份验证详细测试[转] 你可以看看
@-Bei-:
你刚好理解反了我的问题:是接管IIS的身份认证(自己实现ISAPI级别的
WindowsAuthentication),不是IIS接管了身份验证。
@Alvin: 那你去重写:
WindowsAuthenticationModule..::.Authenticate 事件 这个不是很熟悉 你只能自己去网络上面找了,大概就重写
//当前请求进行身份验证时发生。 public void WindowsAuthentication_OnAuthenticate(object sender, WindowsAuthenticationEventArgs args) { if (!args.Identity.IsAnonymous) { args.User = new Samples.AspNet.Security.MyPrincipal(args.Identity); } }
呵呵