【问题标题】:IIS7 basic authentication to protect a site that uses forms authenticationIIS7 基本身份验证以保护使用表单身份验证的站点
【发布时间】:2010-10-19 16:08:53
【问题描述】:

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

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

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

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

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

所以这很愚蠢。

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

非常感谢..

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

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

【问题讨论】:

    标签: authentication iis-7 basic-authentication


    【解决方案1】:

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

    到目前为止,我唯一能完全按照我想要的方式工作的是Helicon Ape。我正在进行试用,到目前为止一切顺利。

    根目录中的标准 .htaccess 文件。

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

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

    【讨论】:

    • 您是否坚持使用此解决方案?有什么缺点吗?
    【解决方案2】:

    您所描述的是默认 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";
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      有一个简单的解决方案,因为您想使用 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
        

      修改条件以满足您的需求,然后通过电子邮件将您的客户/业务类型的凭据发送到前门。

      【讨论】:

      • 如果您想在使用基于表单的登录的测试帐户时授予公司同事访问权限(使用基本登录),此解决方案将不起作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      • 2021-09-24
      • 2019-03-01
      • 1970-01-01
      • 2014-09-15
      相关资源
      最近更新 更多