Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 查询字符串上基本身份验证的IIS重写规则_Asp.net_Iis_Url Rewriting_Iis 7.5_Xwiki - Fatal编程技术网

Asp.net 查询字符串上基本身份验证的IIS重写规则

Asp.net 查询字符串上基本身份验证的IIS重写规则,asp.net,iis,url-rewriting,iis-7.5,xwiki,Asp.net,Iis,Url Rewriting,Iis 7.5,Xwiki,我正在尝试通过基本身份验证自动将用户登录到Xwiki安装。这是因为帮助存储在wiki中,但我们希望检索过程对用户透明 我们将用户推到一个url(通过标记),如: http://username:password@xwiki.example.org/xwiki/bin/view/Main?basicauth=1 这在除Internet Explorer之外的所有浏览器中都能正常工作(请参阅:http://support.microsoft.com/kb/834489。不幸的是,我们80%的用户群使

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

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

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

目前,我们有IIS 7.5放在Xwiki前面,将所有请求代理到另一台服务器上的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&\u username=username&\u password=password

其想法是IIS将把_username/_passwordquerystring参数替换到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时,重写规则无法调用

有什么方法可以达到我想要的行为吗?

这应该可以:

<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中是不可能的。

可以在IIS上使用URL重写进行基本身份验证。您应该在base64中添加服务器变量HTTP\u Authorization,该值后跟用户名:password。请记住在允许的变量中添加该变量

因此,对于密码为open sesame的用户Aladdin,您的格式将是Aladdin:open sesame和base64编码的qwxhzgrpjbvpcgvuihnlc2ftzq==

也就是说 授权:基本QWXHZGRPBJPCGVUIHNLC2FTZQ==

<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>


授权不能委托给ARR。因此,如果内容本质上高度敏感且需要授权,建议您不要启用缓存。

但有一个解决办法


Hmm,IIS返回一个“HTTP错误502.3-坏网关,无法解析服务器名称或地址”。我想可能是将用户名/密码解释为域名的一部分并试图连接到它。我相信这是因为如果我去掉用户名/密码(“{C:1}:{C:2}@”部分)它按预期加载登录页面。您知道有没有办法解决此问题?抱歉,我不熟悉将身份验证详细信息作为域地址的一部分的限制。如果它取决于连接的用户,该怎么办?我当然无法在配置文件中设置它,因为它是根据执行时间计算的。我认为此解决方案可能不适用于ot解决您的问题。您可以使用“重写/代理”功能编写一些东西,并将其用作“解决方法”。您所说的“重写/代理”是什么意思?类似于创建一个发送请求并重写响应的控制器?确实是这样。需要记住的一件非常重要的事情是@Jaco在哪里说要将变量添加到允许的变量中。这是在“查看服务器变量”下的URL重写屏幕上完成的。没有它,它将不会传递变量。这会更好r如果你能够在帖子中包含解决方案的相关部分;如果链接离线,你的答案仍然有用。