【问题标题】:IIS rewrite rule for basic auth on the querystring查询字符串上基本身份验证的 IIS 重写规则
【发布时间】:2012-03-18 08:04:34
【问题描述】:

我正在尝试通过基本身份验证将用户自动登录到 Xwiki 安装。这是因为帮助存储在 wiki 中,但我们希望检索过程对用户透明。

我们将用户推送到一个 url(通过<a> 标签),例如: http://username:password@xwiki.example.org/xwiki/bin/view/Main?basicauth=1

这在除 Internet Explorer 之外的所有浏览器中都可以正常工作(请参阅:http://support.microsoft.com/kb/834489。不幸的是,我们 80% 的用户群使用 Internet Explorer,不能让他们手动输入凭据。

目前,我们在 Xwiki 前面安装了 IIS 7.5,并将所有请求代理到另一台服务器上的 Tomcat 实例。这工作正常。为了解决我的问题,我想我可以使用 IIS 重写规则来转换这样的 url:

http://xwiki.example.org/xwiki/bin/view/Main?basicauth=1&_username=username&_password=password

进入这个:

http://username:password@xwiki.example.org/xwiki/bin/view/Main?basicauth=1&_username=username&_password=password

这个想法是 IIS 会将 _username/_password 查询字符串参数替换为 URL 并将其传递给 Tomcat,而 Xwiki 将忽略额外的参数。

我创建了一个 URL 重写规则,例如:

<rule name="BasicAuthRewrite" enabled="true">
   <match url="https?://(.+)&amp;?_username=(.+)&amp;_password=(.+)" />
   <action type="Rewrite" url="http://{R:2}:{R:3}@xwiki.example.org/{R:1}" />
</rule>

当我在 IIS 中进行“测试模式”并提供我的 url 时,所有反向引用 ({R:x}) 都与我想要的数据相匹配。但是,当我在浏览器中访问 URL 时,重写规则无法调用。

有什么方法可以实现我想要的行为?

【问题讨论】:

    标签: asp.net iis url-rewriting iis-7.5 xwiki


    【解决方案1】:

    授权不能委托给 ARR。因此,如果内容是高度敏感的,需要授权的,建议不要开启缓存。 ARR

    但是有解决办法。

    Solution

    【讨论】:

    • 如果您能够在帖子中包含解决方案的相关部分,那就更好了;如果链接脱机,您的答案仍然有用。
    【解决方案2】:

    可以在 IIS 上使用 URL 重写进行基本身份验证。您应该添加服务器变量 HTTP_Authorization 值 Basic 后跟用户名:base64 中的密码。记得在允许的变量中添加变量

    因此,对于密码为 open sesame 的用户 Aladdin,格式为 Aladdin:open sesame 和 base64 编码的 QWxhZGRpbjpvcGVuIHNlc2FtZQ==。

    翻译成 授权:基本QWxhZGRpbjpvcGVuIHNlc2FtZQ==

    <rule name="SomeName" stopProcessing="true">
        <match url="url/to/match" />
        <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
        <action type="Rewrite" url="http://www.redirecturl.com/" appendQueryString="true" />
        <serverVariables>
            <set name="HTTP_Authorization" value="Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==" />
        </serverVariables>
    </rule>
    

    【讨论】:

    • 如果它依赖于连接的用户怎么办?我当然不能在配置文件中设置它,因为它是根据执行时间计算的。
    • 我认为此解决方案可能不适用于您的问题。您可以编写具有重写/代理功能的东西并将其用作“解决方法”。
    • “重写/类似代理”是什么意思?类似于创建一个发送请求并重写响应的控制器?
    • 确实是这样。
    • 要记住的一个非常重要的事情是@Jaco 说将变量添加到允许的变量中。这是在“查看服务器变量”下的 URL 重写屏幕上完成的。没有它,它不会传递变量。
    【解决方案3】:

    这在 IIS 中似乎是不可能的。

    【讨论】:

      【解决方案4】:

      应该这样做:

      <rule name="BasicAuthRewrite" stopProcessing="true">
          <match url="(.*)" />
          <conditions trackAllCaptures="true">
              <add input="{QUERY_STRING}" pattern="basicauth=1&amp;_username=(.+)&amp;_password=(.+)" />
          </conditions>
          <action type="Rewrite" url="http://{C:1}:{C:2}@xwiki.example.org/{R:1}" appendQueryString="false" />
      </rule>
      

      【讨论】:

      • 嗯,IIS 返回“HTTP 错误 502.3 - 网关错误,无法解析服务器名称或地址”。我认为它可能会将用户名/密码解释为域名的一部分并尝试连接到它。我相信这是因为如果我取出用户名/密码(“{C:1}:{C:2}@” 部分),它会按预期加载登录页面。你知道有没有办法解决这个问题?
      • 抱歉,我不熟悉将身份验证详细信息作为域地址的一部分的限制。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 2013-03-19
      相关资源
      最近更新 更多