2010-10-19 72 views
16

这应该比事实证明更简单!用于保护使用表单身份验证的站点的IIS7基本身份验证

我有一个使用形式的身份验证,以确保位点(即,构件登录区域)的一部分的ASP.Net网络应用程序。

现在我只是希望把传统的/简单的浏览器弹出密码(目录安全性)在整个网站,因为我们正在测试它,不希望任何人在整个网站绊倒,看到了未完成版本等等!

过去,这是超级简单的老年IIS版本。

我已经“安装基本身份验证”(如IIS7不出来这个盒子现在)。但是,当我启用它时,它告诉我,我不能在任何基于重定向的身份验证(这是我的FORMS身份验证使用的)的同时启用它。

所以,这只是愚蠢。

必须有一个超级简单的方法来简单地把整个网站的廉价弹出的密码,而不会影响你有内部的web.config设置为实际应用中的其他身份验证方法。

非常感谢..

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

我们似乎什么都在这里是微软尝试过工程师的事情,结果一个超级简单的古老的要求已不再可能或容易achieveable一个巨大的情况下。这必须可能以某种方式...任何人?

回答

2

有你一个简单的解决方案,因为要使用窗体身份验证...

  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. ALL DONE!这将锁定您的整个站点,并允许您独立于站点的其他部分指定用户名和密码(我称之为“锁定前门”)。前门凭据前门文件本身在该条件规定(不是很安全,但配不上你(我们)需要什么):

    [6号线:]

    If ((UserEmail.Text = "TheSharedFrontDoorLogonName") And (UserPass.Text = "AndItsPassword")) Then 
    

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

+0

如果您希望在使用基于登录表单的测试帐户时访问公司同事(使用基本登录),此解决方案将无法正常工作。 – Dementic 2013-06-19 19:50:55

4

我遇到了同样的问题。我将推出限于预览组的测试版网站。该网站使用表单身份验证,但预览组中的一些人将拥有网站帐户,而其他人则不会。不管每个人都需要在根目录进行身份验证才能访问预览。

到目前为止,我按照我想要的方式完成的唯一工作是Helicon Ape。我正在进行试验,迄今为止这么好。

标准的.htaccess文件在根目录下。

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

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

+0

你坚持使用这个解决方案吗?有什么缺点? – marapet 2012-04-26 09:14:04

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"; 
     } 
    } 
} 
相关问题