【问题标题】:IIS7 - Password Protect Development ServerIIS7 - 密码保护开发服务器
【发布时间】:2009-08-05 13:45:53
【问题描述】:

我有一个运行 IIS 7.0 和 ASP.NET MVC Web 应用程序的开发服务器,它使用表单身份验证/成员身份进行身份验证。

我需要能够防止未经授权的用户查看此网站。然而,我们的客户应该能够输入一个简单的用户名/密码来获得访问权限。

完成此操作后,他们应该能够使用表单身份验证与 Web 应用程序进行交互,就好像他们刚刚来到一个未受保护的站点一样。

有什么建议吗?

【问题讨论】:

  • 这是 IIS7 的绝对失败/不足之处。微软在这里的过度工程和短视的大量案例。这应该是一个一键式“添加廉价的脏弹出密码”按钮,与他们提出的所有过度设计的学术美丽世界的复杂身份验证模块和废话分开。
  • 令人惊讶的是,似乎完全愿意接受这一点并通过编写自己的自定义包装模块等来忍受它的笨蛋的数量。只是总过度设计的人,得到这个程序。这应该很简单。我不会编写任何自定义代码来实现过去需要 2 秒才能配置的弹出式密码。必须有一个简单的方法。
  • 很高兴看到不只是我有这个问题

标签: asp.net-mvc iis-7 passwords


【解决方案1】:

我之前的回答说表单身份验证和基本 http 身份验证可以在 II7 集成模式下并存。我完全错了,后来做了一个简单的解决方案。

使用自定义 HttpModule,您可以在常规表单身份验证旁边添加基本身份验证

public class CustomBasicAuthHttpModule : IHttpModule
{
    private HttpApplication httpApplicationContext;

    public void Dispose()
    {
    }

    public void Init(HttpApplication context)
    {
        this.httpApplicationContext = context;
        context.BeginRequest += this.OnBeginRequest;
        context.EndRequest += this.OnEndRequest;
    }

    private void OnBeginRequest(object sender, EventArgs e)
    {
        // your logic of checking Auth header goes here
        if (this.httpApplicationContext.Request.Headers["Authorization"] != "Basic base64-encoded-user:pass")
        {
            this.httpApplicationContext.Response.StatusCode = 401;
            this.httpApplicationContext.Response.End();
        }
    }

    private void OnEndRequest(object sender, EventArgs e)
    {
        if (this.httpApplicationContext.Response.StatusCode == 401)
        {
            this.httpApplicationContext.Response.AddHeader("WWW-Authenticate", "Basic");
        }
    }

然后在你的 web.config 中

  <system.webServer>
    <modules>
      <add name="CustomBasicAuthHttpModule" type="Namespace.CustomBasicAuthHttpModule, AssemblyName"/>
    </modules>
  </system.webServer>

【讨论】:

  • 其实在我的情况下它并不简单。您的解决方案是我尝试的第一件事-但不知何故,“基本身份验证”干扰了最基本的新 MVC 项目的“表单身份验证”,正如我们从 Visual Studio / 新项目中所知道的那样。通过“基本身份验证”进行身份验证后,无论我尝试什么,我都会被重定向到默认登录 url,甚至不允许我的浏览器下载 Site.css 文件。有什么想法吗?!
  • IIS基本认证与forms认证无关,完全不同。您提出问题的方式听起来像是您想阻止除您的客户以外的任何人对表单登录页面的所有访问,但是一旦通过 IIS 质询-响应,他们就会通过表单身份验证登录。我不知道如何让 IIS 代表 sql 表单进行身份验证,抱歉。我想我也不明白,表单身份验证有什么问题,为什么 IIS 质询-响应会更好?
  • 你完全错了 jayrdub。这个问题得到了很好的解释,这是一个非常普遍的要求。 IIS 本身声明“基本身份验证不能与任何基于重定向的身份验证方法(例如表单身份验证)一起使用”。 “Windows 身份验证”也带有同样的警告。您可以同时使用基本身份验证和 Windows 身份验证,前提是您没有在应用程序下面运行表单身份验证。 OP 的问题是非常合理且普遍的要求。
  • 拥有一个在应用程序本身中使用“表单身份验证”的 ASP.Net 应用程序是非常常见的。说明:这只是在您的网站上拥有一个“会员登录”区域 - 大多数网站都有类似的东西。然后你还想在整个网站上抛出一个快速而肮脏的弹出密码,因为它目前正在开发/测试中,你不希望随机的互联网冲浪者遇到它。这在 IIS6 和 unix web 服务器上一直都在做,为什么 IIS7 不能允许一键进行如此简单的配置。
  • @Aaron,你完全正确,我不知道我为什么这样回答。我编辑并添加了我使用的解决方案
【解决方案2】:

我刚刚用Helicon Ape 做了这个。免费许可证包括 3 个站点,对我来说已经足够了。

如果您在站点上使用它,请记住检查是否为站点激活了许可证(开始菜单 > helicon > ape > 管理器、帮助、许可证管理器)。

【讨论】:

  • 这样一个简单的任务不需要第三方插件。
  • 不,不应该。可悲的是,这并不意味着它不是。
【解决方案3】:

正如 Aaron 所指出的,这在 IIS7 中并不是那么简单。现在,另一方面是这个旧技巧充其量是不安全的,现在有更好的方法可以做到这一点,并且能够对所有应用程序使用所有身份验证方法有很多优势。有一些方法可以解决这个问题,例如:

a) 将开发站点保留在您的客户可以访问的 VPN 后面。
b) 反向代理站点,并让代理进行 http 身份验证。
c)更多涉及的是使用演示模式构建您的应用程序。这里的技巧是在给定特殊的魔术查询字符串的第一个请求中使其打开或关闭。在 Session_Start() 中检查,然后标记附带它的用户并获利。

【讨论】:

    【解决方案4】:

    我们为 IIS 编写了一个自定义模块,以允许某些 IP 范围自动通过,并向其他任何人显示登录对话框。一旦他们登录,它就会将该事实存储在他们的会话中并简单地传递请求。

    工作正常,可以应用于 IIS 站点或服务中的任何内容。

    【讨论】:

    • 当我的 ISP 每次都给我一个完全随机的动态 IP 时,这不好。当我需要访问一组选定的测试人员或业务合作伙伴时也没有好处,比如其中 50 个,他们都需要访问开发站点。我不能让他们每个人都花一个小时来摸索他们的 IP 地址,因为他们都位于不同的物理位置,而且他们是业务人员,而不是技术人员。他们不知道如何从他们的路由器/网络配置等中获取他们的 IP 地址。我只需要能够通过电子邮件向他们发送密码,这样他们就可以轻松访问网站。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    相关资源
    最近更新 更多