最近打算给公司建立一个论坛,选择了dvbbs .net 开源版本. 但是又想运行在公司的域上。由于dvbbs肯定是forms验证,想改成双重验证.
使用Windows Active Directory登录,获取用户名,然后查询数据库得到数据。
小结论:所有的forms验证其实都集成了Windows login.
主要思路: 解决方案自动获取内网的Windows用户名,如果没有就把用户转到登录界面.
Forms 认证
首先确定使用哪一种ASP.NET认证. 由于ASP.NET只可以有一种认证类型,所以只能先选择一个. Windows认证只提供用户名,无论它是ASP.NET进程用户还是实际客户端用户(如果IIS被配置成为Disable匿名访问).所以只有Forms认证才可以根据需要自己定制.所以我们就要在web.config里面设置成:Forms认证. 所以必须保证我们的ASP.NET应用程序必须是IIS应用程序.另外必须在Web.config定义好Authorzation,即Deny匿名用户.
另外一般情况是Authentication Form把loginUrl设置成为Login.aspx,但是由于我们必须使用集成Windows安全, 所以就不能使用logon页,所以我们的loginUrl就必须是使用集成Windows安全的页面,我们设置成为WinLogin.aspx.
IIS Windows Security
接着我们就要在WinLogin.aspx里面来处理windows集安全。它包括拒绝匿名用户,获得客户端Windows证书, 获得客户端Windows用户名,以及 连接上Forms认证. 另外还要处理Windows安全失败的情况. 注意WinLogin.aspx中不可以有html. 它只是一个windows集安全测试.
首先我们拒绝匿名用户,获得客户端Windows证书.
打开IIS管理器,右击WinLogin.aspx文件, 点击属性, 选择文件安全 标签: 去掉 使用匿名登录选项, 选择集成Windows认证选项.
这样做还不能自动得到用户名,我们还需要使用页面跟踪, 或者使用反编译器,在WindowsAuthenticationModule中的OnEnter方法. 用户名的服务器变量名叫LOGON_USER, Request.ServerVariables["LOGON_USER"]
再调用FormsAuthentication.RedirectFromLoginPage 来进入Forms认证. 这个方法设置了认证Cookie,并且转到原来的page.
IIS Custom 401 错误
如果你只想使用集成Windows安全的话,这就够了,但是你还要处理集成安全失败的情况,这就要把他们转到你自定义的登录界面来获得用户证书.集成Windows安全会因为用户浏览器的不同而不同。非IE浏览器会给用户一个登录框,这时用户就可能会选择取消,这样就会造成集成Windows安全失败.
这时用户就会得到一个401错误. 通常ASP.NET会内置功能在web.config文件中来获得和并且重新转向. 可惜 401, 403 并不包括在内,所以必须用其它方法来解决. 再一次提醒,必须使用IIS. 通过发送401状态错误代码来触发认证,以避免需要IIS来处理401错误.
打开IIS管理器,右击WinLogin.aspx文件, 点击属性, 选择文自定义标签:编辑不同的401错误,并且做好自定义的重新转向. 可惜,重新转向必须是一个静态文件, 而且是全物理地址, 这个文件包括javacript,meta标签,再重定向到真正的ASP.NET登录Form, 我们定义成为WebLogin.aspx.
注意此时失去了原来的ReturnUrl,因为IIS错误的重定向只能使用静态文件,以此这留待以后处理.
Forms Custom Logon
下一步就是建立通常的Forms认证(WebLogin.aspx). UI至少应该包含两个textboxes和一个submit,。通过相应的代码(在此你可以选择一些自定义的角色或者windows组),你可以获得一个已经认证通过的用户和用户名. 我们再call FormsAuthentication.RedirectFromLoginPage 来再一次登录 Forms 认证. 但是由于我们之前已经失去了ReturnUrl,所以我们必须另外设置认证Cookie:FormsAuthentication.SetAuthCookie, 然后手工再转向到原来的ReturnUrl。 大功告成?No,你会发现你还是会重新回到WinLogin.aspx. 所以我们可以直接转到WebLogin.aspx . 你目前还没有需要要的Permission. 此时你可以选择建立Forms认证并且把authorization设置成为:拒绝匿名用户。这样就可以让用户有权限访问loginUrl,在此就是WinLogin.aspx. 所以我们还要订明WebLogin.aspx 可以允许匿名用户(使用location).
OK,大功告成。
参考链接:
- Mixing Forms and windows security in ASP.NET http://msdn.microsoft.com/en-us/library/ms972958
-
如何在ASP.NET中使用System.DirectoryServices名称空间
-
ASP.NET Windows集成Forms验证登陆 http://zhidao.baidu.com/question/154450260