URL 将自定义 Header 重写为 Cookie

URL Rewrite Custom Header into a Cookie

我有一个客户端向 Web API 发出 http 请求。 API 使用 cookie 进行保护;但是,此客户端无法发送 cookie。此客户端能够发送自定义 http headers。那么我们是否可以使用重写模块来获取自定义的 http header 并将其设置为 cookie。

我已将 HTTP_COOKIE 添加为服务器变量。我挣扎的地方是条件。如何设置条件以拉取自定义 http header,并将其设置为 cookie。

编辑 所以我使用下面的规则将 header 复制到 cookie

            <rule name="cookie" patternSyntax="ECMAScript">
                <match url=".+" />
                <serverVariables>
                    <set name="HTTP_COOKIE" value="{C:0}" />
                </serverVariables>
                <action type="None" />
                <conditions logicalGrouping="MatchAny" trackAllCaptures="false">
                    <add input="{HTTP_ccauth}" pattern=".+" />
                </conditions>
            </rule>

现在它覆盖了 cookie,所以我需要附加到它...

在我看来,如果 WebAPI 是通过使用 cookie 来保护的,则客户端应该通过 WebAPI 身份验证(JWT,Asp.Net 身份)系统进行身份验证,而不是设置本地缓存来传输凭据。如果客户端 cookie 可以通过 JS/Postman 设置,则系统不安全,建议使用 HttpOnly 类型的 cookie。
此外,您可以在 URL 中添加一个查询字符串来确定是否设置本地缓存。请参考以下链接。
https://www.reddit.com/r/dotnet/comments/2xb6a5/is_there_a_way_to_add_a_setcookie_header_using/
https://clarify.dovetailsoftware.com/gsherman/2011/01/20/using-the-url-rewrite-module-to-set-your-cookies-to-httponly/

需要两条规则,一条在没有cookie的情况下设置cookie,另一条在有cookie的情况下将其附加到cookie

<rule name="Append Auth Header to Cookies" patternSyntax="ECMAScript" stopProcessing="true">
    <match url=".+"/>
    <conditions logicalGrouping="MatchAll" trackAllCaptures="true">
        <add input="{HTTP_ccauth}" pattern="(.+)"/>
        <add input="{HTTP_COOKIE}" pattern="(.+)"/>
    </conditions>
    <serverVariables>
        <set name="HTTP_COOKIE" value="{C:1}{C:2}"/>
    </serverVariables>
    <action type="None"/>
</rule>
<rule name="Set Auth Header to Cookies" patternSyntax="ECMAScript" stopProcessing="true">
    <match url=".+"/>
    <conditions logicalGrouping="MatchAll" trackAllCaptures="true">
        <add input="{HTTP_ccauth}" pattern="(.+)"/>
    </conditions>
    <serverVariables>
        <set name="HTTP_COOKIE" value="{C:1}"/>
    </serverVariables>
    <action type="None"/>
</rule>