IIS7基本身份验证,用于保护使用表单身份验证的站点

时间:2010-10-19 16:08:54

标签: authentication iis-7 basic-authentication

这应该比事实证明的要简单得多!

我有一个ASP.Net网络应用程序,它使用FORMS身份验证来保护网站的一部分(即会员登录区域)。

现在我只想在整个网站上放置一个传统的/简单的浏览器密码弹出窗口(目录安全性),因为我们正在对它进行测试,并且不希望任何人偶然发现整个网站,看到未完成的版本等等!

在旧的IIS版本中,这曾经非常简单。

我已经“安装了基本身份验证”(因为IIS7现在没有开箱即用)。但是当我启用它时,它告诉我,我不能在任何基于重定向的身份验证的同时启用它(这是我的FORMS身份验证使用的)。

所以这只是愚蠢的。

必须有一种超级简单的方法可以简单地在整个站点上放置一个廉价的弹出密码,而不会影响您在web.config中为实际应用程序设置的其他身份验证方法。

非常感谢..

更新 由于以下几个原因,IP访问限制并不好:   - 我的IP是动态的,因此不断变化。   - 我不想打扰任何需要看到该网站的人,要求他们在他们的机器上调出一个控制台并计算他们的IP地址或检查他们的路由器等。其中许多是非技术性的商业用户,它会花一个小时来计算他们的IP地址。   - 基本身份验证和Windows身份验证都不允许底层表单身份验证保留在下面。

我们在这里看到的是一个巨大的案例,微软试图过度设计事物,因此超级简单的古老要求不再可能或不易实现。这有可能以某种方式......任何人???

3 个答案:

答案 0 :(得分:5)

我遇到了同样的问题。我将建立一个仅限于预览组的测试版网站。该网站使用表单身份验证,但预览组中的某些人将拥有网站帐户,而其他人则不会。无论每个人都需要在root身份验证才能访问预览。

到目前为止,我唯一能按照我想要的方式工作的是Helicon Ape。我正在进行试验,到目前为止一直很好。

root中的标准.htaccess文件。

AuthUserFile c:\fakepath\.htpasswd
AuthType Basic
AuthName "SITE SECURITY"
Require valid-user

用户.htpasswd添加用户名和密码:username:encryptedpassword

答案 1 :(得分:3)

您所描述的是默认ASP.NET的限制,它仅构建为一次运行一个身份验证模块。解决方案是构建自己的IHttpModule来执行自定义身份验证,如果成功,则将请求传递给继续使用Forms的ASP.NET。

以下是此类模块的基本实现。它将返回401 Unauthorized并要求用户登录领域WOPR。然后它将接受密码Joshua,忽略指定的用户名。

将其编译为单独的程序集,并将其添加到您的web.config,system.web/httpModulessystem.webServer/modules部分。不需要对您的Web应用程序进行其他修改。

using System;
using System.Text;
using System.Web;

namespace Research {
    public class AuthenticationModule : IHttpModule {
        public void Init(HttpApplication app) {
            app.BeginRequest += (sender, e) => {
                if (!Authenticate(app.Context)) {
                    app.Context.Response.Status = "401 Unauthorized";
                    app.Context.Response.StatusCode = 401;
                    app.Context.Response.AddHeader("WWW-Authenticate", "Basic realm=WOPR");

                    app.Response.ClearContent();
                    app.Context.Response.End();
                }
            };
        }

        public void Dispose() {
        }

        public static Boolean Authenticate(HttpContext context) {
            var authHeader = context.Request.Headers.Get("Authorization");
            if (String.IsNullOrEmpty(authHeader))
                return false;

            if (!authHeader.StartsWith("Basic "))
                return false;

            var base64Credentials = authHeader.Substring(6);
            var binaryCredentials = Convert.FromBase64String(base64Credentials);
            var asciiCredentials = Encoding.ASCII.GetString(binaryCredentials);
            if (!asciiCredentials.Contains(":"))
                return false;

            var credentials = asciiCredentials.Split(new[] { ':' }, 2);
            return credentials[1] == "Joshua";
        }
    }
}

答案 2 :(得分:2)

因为您想使用FORMS身份验证,所以有一个简单的解决方案......

  1. 将此部分添加到主标题下的web.config中。不要合并它 - 只需将其粘贴为一个块即可。位置标记将这些规则与web.config的其余部分隔离开来,以便以后轻松删除。

     <location allowOverride="false">
                 <system.web>
                     <authentication mode="Forms">
                         <forms loginUrl="frontdoor.aspx" name=".ASPXFORMSAUTH">
                         </forms>
                     </authentication>
                     <authorization>
                         <deny users="?" />
                     </authorization>
                 </system.web>
             </location>
    
  2. 创建一个名为“frontdoor.aspx”的页面。从以下链接获取该aspx页面的内容:http://msdn.microsoft.com/en-us/library/xdt4thhy.aspx(向下滚动到它所说的位置:“创建登录页面”)

  3. 全部完成!这将锁定整个站点,并允许您指定前门的用户名和密码(我将此过程称为“锁定前门”),与站点的其余部分无关。前门凭证在前门文件中指定(不是很安全,但足以满足您(我们)需要的条件):

    [第6行:]

    If ((UserEmail.Text = "TheSharedFrontDoorLogonName") And (UserPass.Text = "AndItsPassword")) Then
    
  4. 修改条件以满足您的需求,然后通过电子邮件将客户/业务类型的凭据输入到前门。