iis 配置--根据另一个节点属性值中的值设置不同节点中的多个属性

ar5n3qh5  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(148)

问题:我想读取web.config文件中的一个值,并基于该值,将其他两个节点中存在特定属性的节点转换为新属性值。
要读取的值:ClientName,可以是ABCD或WXYZ。如果是WXYZ,则更改....要更改的值:requireSSL从true(如果客户端名称为ABCD)或false(如果为WXYZ)。
此值将位于不是ClientName节点的子节点的不同节点中。
这是我想做的:

    • 旧的Web配置:**
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <appSettings>
        <add key="ClientName" value="ABCD" />
    </appSettings>
    <system.web>
        <httpCookies requireSSL="true" />
        <authentication mode="Forms">
            <forms cookieless="UseCookies" enableCrossAppRedirects="true" defaultUrl="~/Account/Login.aspx" loginUrl="~/Account/Login.aspx" protection="All" timeout="15" requireSSL="true" />
        </authentication>
    </system.web>
</configuration>
    • 新Web配置:**
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <appSettings>
        <add key="ClientName" value="WXYZ" />
    </appSettings>
    <system.web>
        <httpCookies requireSSL="false" />
        <authentication mode="Forms">
            <forms cookieless="UseCookies" enableCrossAppRedirects="true" defaultUrl="~/Account/Login.aspx" loginUrl="~/Account/Login.aspx" protection="All" timeout="15" requireSSL="false" />
        </authentication>
    </system.web>
</configuration>
  • 我想读取"ClientName"的值,如果它是"WXYZ",那么我想将"requireSSL"设置为"false"。但是,如果它是任何其他值("ABCD"或其他任何值),那么我想将它设置为"true"。

我不想更改"客户端名称"的值。它将在这个过程之外设置。但是,如果它是"WXYZ",那么我希望"requireSSL"为"false",否则为"true"。
为了避免混淆,我声明我在这里只使用"ABCD"作为ClientName值,在我的现实世界中,它们是不同的,并且思想是当转换检测到ClientName是这个特定的值时,转换发生,否则,它不发生。
对于我们的大多数站点,我们希望requireSSL = true,但我们有几个特定的站点需要它为false。我希望这是有意义的。无论如何,鉴于旧的Web配置如上所述,想法是基于ClientName,我需要的值为true或false。

    • 此转换有效,但不读取任何"ClientName"值:**
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <appSettings>
        <add key="ClientName" value="ABCD" />
    </appSettings>
    <system.web>
        <httpCookies requireSSL="false" xdt:Transform="SetAttributes" xdt:Locator="Condition(@requireSSL='true')" />
        <authentication mode="Forms">
            <forms cookieless="UseCookies" 
            enableCrossAppRedirects="true" 
            defaultUrl="~/Account/Login.aspx" 
            loginUrl="~/Account/Login.aspx" protection="All" 
            timeout="15" requireSSL="false"
            xdt:Transform="SetAttributes" xdt:Location="Condition(@requireSSL='true')" />
        </authentication>
    </system.web>
</configuration>

因此,这或多或少是我的出发点,但我不知道从这里去哪里。学习微软网站在页面的最后有一部分显示了一个可能的解决方案,但我只是没有摸索它。
我使用this site来测试我的转换。
到目前为止,我已经尝试过了:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xdt:Locator="Condition(@ClientName='ABCD')">
    <appSettings>
        <add key="ClientName" value="ABCD" />
    </appSettings>
    <system.web>
        <httpCookies requireSSL="false" xdt:Transform="SetAttributes(requireSSL)" />
        <authentication mode="Forms">
            <forms cookieless="UseCookies" 
            enableCrossAppRedirects="true" 
            defaultUrl="~/Account/Login.aspx" 
            loginUrl="~/Account/Login.aspx" protection="All" 
            timeout="15" requireSSL="false"
            xdt:Transform="SetAttributes(requireSSL)" />
        </authentication>
    </system.web>
</configuration>

这一点:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xdt:Locator="Condition(@ClientName='ABCD')">
    <appSettings>
        <add key="ClientName" value="ABCD" />
    </appSettings>
    <system.web>
        <httpCookies requireSSL="false" xdt:Transform="SetAttributes" />
        <authentication mode="Forms">
            <forms cookieless="UseCookies" 
            enableCrossAppRedirects="true" 
            defaultUrl="~/Account/Login.aspx" 
            loginUrl="~/Account/Login.aspx" protection="All" 
            timeout="15" requireSSL="false"
            xdt:Transform="SetAttributes" />
        </authentication>
    </system.web>
</configuration>

这一点:
还有这个

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xdt:Locator="XPath(configuration/appSettings/add[@key='ClientName' and @value='INEI'])">
    <appSettings>
        <add key="ClientName" value="INEI" />
    </appSettings>
    <system.web>
        <httpCookies requireSSL="false" xdt:Transform="SetAttributes(requireSSL)" />
        <authentication mode="Forms">
            <forms cookieless="UseCookies" 
            enableCrossAppRedirects="true" 
            defaultUrl="~/Account/Login.aspx" 
            loginUrl="~/Account/Login.aspx" protection="All" 
            timeout="15" requireSSL="false"
            xdt:Transform="SetAttributes(requireSSL)" />
        </authentication>
    </system.web>
</configuration>

所有这些都不会在在线测试应用程序中产生错误,但我得到的值始终为"true"。我还做了许多其他的变化,但它们都在requireSSL值处留下了"true"。
我希望有人确切地知道如何解决这个问题,并能提供解决方案,或者有人知道这是如何工作的,并能告诉我,这根本不可能做到。

qojgxg4l

qojgxg4l1#

请通过XSLT 1.0尝试以下解决方案
它使用的是所谓的"身份转换"模式。

    • 输入XML**
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <appSettings>
        <add key="ClientName" value="WXYZ"/>
    </appSettings>
    <system.web>
        <httpCookies requireSSL="true"/>
        <authentication mode="Forms">
            <forms cookieless="UseCookies" enableCrossAppRedirects="true" defaultUrl="~/Account/Login.aspx" loginUrl="~/Account/Login.aspx" protection="All" timeout="15" requireSSL="true"/>
        </authentication>
    </system.web>
</configuration>
    • XSLT格式**
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" encoding="utf-8" omit-xml-declaration="no"/>
    <xsl:strip-space elements="*"/>

    <!--Identity Transform pattern-->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="@requireSSL">
        <xsl:choose>
            <xsl:when test="/configuration/appSettings/add[@key='ClientName' and @value='WXYZ']">
                <xsl:attribute name="requireSSL">
                    <xsl:text>false</xsl:text>
                </xsl:attribute>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy-of select="."/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>
    • 产出**
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="ClientName" value="WXYZ" />
  </appSettings>
  <system.web>
    <httpCookies requireSSL="false" />
    <authentication mode="Forms">
      <forms cookieless="UseCookies" enableCrossAppRedirects="true" defaultUrl="~/Account/Login.aspx" loginUrl="~/Account/Login.aspx" protection="All" timeout="15" requireSSL="false" />
    </authentication>
  </system.web>
</configuration>

相关问题