ASP.NET开发经验(4) — 一种简便地同时使用匿名与集成 Windows 验证的方法

相对来说,集成 Windows 验证是 ASP.NET 提供的一种安全性较高的验证方式,不用考虑被 Sniffer、不用去创建登录页面、不用去考虑登录失败次数限制、更重要的是,不用在应用程序中提供用户管理的功能,以及如何保护数据库中的用户名和密码。

经常会碰到这种应用场景:用户对一些普通功能可以匿名访问,对另外一些高级/管理功能,则需要登录后才能使用,很多人的做法就是将普通功能的页面放置在一个目录中,而高级/管理功能的页面则放在另外一个目录中,使用不同的 Web.Config 设置(<authorization> 的 <allow/> 或 <deny/>节)来控制,这样可能带来的一个问题就是:实现同样功能的页面可能要被复制两份,分别部署在这些目录中。

如果全部页面只在一个目录中,有什么办法可以同时实现匿名和授权用户的访问呢?即如何在需要验证用户的时候,弹出那个集成验证的对话框。

如果是基于 Forms 验证,则只需要手动调用(链接)一个 Login.aspx 就可以解决这个问题,但对于 Windows 集成验证来说,仔细查看了一下 WindowsAuthenticationModule 类,似乎没有找到可以编程控制来弹出 Windows 集成验证的那个对话框的方法。

还是采取了一个土办法。

  • 原有页面目录中的 Web.Config 设置如下:

   <authorization>
        <allow users=”*” />
   </authorization>

  • 新建一个子目录,Web.Config 设置如下:

   <authorization>
        <deny users=”?” />
   </authorization>
  

  • 在子目录中创建一个简单的 Auth.aspx ,使其 Response.Redirect 到上级目录中的页面
  • 在原有页面中的适当位置,建立一个“Login”的链接,指向 Auth.aspx

这样就可以在原有页面中通过 User.Identity.Name 是否为空来检测用户是否登录,当然也可以在 Auth.aspx 中通过检查用户的 User.Identity.Name ,来进行一些其它的处理,如取出用户的权限、记录日志等。

估计还有更好的方法,探寻中 … …

“ASP.NET开发经验(4) — 一种简便地同时使用匿名与集成 Windows 验证的方法”的4个回复

  1. 我感觉 Windows 集成式的验证在 ASP.NET 中应该很少应用,因为它似乎只能在 Windows 局域网中的站点。而大多数情形中,我们制作 ASP.NET 站点是为了提供给 Internet 用户的。

  2. @破宝:

    也难说,其实有大量的Intranet应用都是用ASP.NET开发的,它的一些技术特征也比较适合较高带宽的内网应用,因此moslem的这个tip还是很有意义的——但是其实应该有更好的方法的(我记得有一个HTTP Status Code就是用来激活客户端的认证过程的……回头查查)。

    @moslem:

    老兄好久不见,有空来寒舍一坐哟!顺便给我们团队讲讲安全方面的开发知识吧!:)

  3. To 破宝

    最多应该还是给企业内部做ASP.NET,,基于Internet的客户很少用ASP.NET。

    第一 ASP.NET主机难找。而且价格高。
    第二 程序员难找,ASP.NET的程序员不多,至少在大连是这样。

    除非是大公司,自己有Internet服务器。。

  4. To JGTM:

    经你提醒,我也好象记得返回指定的 HTTP Status Code 就可以的,应该是 407 吧,但 407 中也分为好几种的,Basic , NTLM 等,不知道如何继续了 🙂

    有空参观一下你们的公司。

    正如 TommyWoo 所说,现在确实有很多 Intranet 的应用都是 B/S 模式,很多是用 ASP.NET 来做的,感觉 ASP.NET 的页面中由于有了 ViewState ,体积大了不少,在 Internet 上跑,感觉有点慢。

评论已关闭。