如何集成Windows login, forms集成验证?

最近打算给公司建立一个论坛,选择了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,大功告成。

 

参考链接:

  1. Mixing Forms and windows security in ASP.NET http://msdn.microsoft.com/en-us/library/ms972958 
  2. 如何在ASP.NET中使用System.DirectoryServices名称空间

    http://support.microsoft.com/kb/329986/zh-cn 

  3. ASP.NET Windows集成Forms验证登陆 http://zhidao.baidu.com/question/154450260

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值