2

我有一个包含一些 saml 信息的 xml 文件 saml.config。该信息需要在发布版本中进行转换,以包含生产 URL,而不是开发和暂存 URL。在我的开发和登台环境中,转换发生得很完美,在发布环境中,转换不会发生。

我一直在尝试http://webconfigtransformationtester.apphb.com/来测试转换,但它们没有被应用,但同样,VS 完美地应用了它们。

基础 saml.config 文件:

<?xml version="1.0"?>
<SAMLConfiguration xmlns="urn:componentspace:SAML:2.0:configuration">
    <ServiceProvider Name="Portal.Web" AssertionConsumerServiceUrl="http://localhost:49462/SingleSignOn/ConsumeAssertion"/>
    <PartnerIdentityProvider Name="MTMIdentity"
                             SignAuthnRequest="false"
                             WantResponseSigned="false"
                             WantAssertionSigned="false"
                             WantAssertionEncrypted="false"
                             SingleSignOnServiceUrl="https://identity.*********.com/SingleSignOn/"/>
</SAMLConfiguration>

转换文件:

<?xml version="1.0" encoding="utf-8" ?>
<SAMLConfiguration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xmlns="urn:componentspace:SAML:2.0:configuration">
  <ServiceProvider Name="Portal.Web" AssertionConsumerServiceUrl="https://***********.com/SingleSignOn/ConsumeAssertion" xdt:Transform="SetAttributes" xdt:Locator="Match(Name)" />
</SAMLConfiguration>

结果应该将服务提供者 AssertionConsumerServiceUrl 中的 localhost url 替换为 ***********.com 版本,但它没有

<?xml version="1.0"?>
<SAMLConfiguration xmlns="urn:componentspace:SAML:2.0:configuration">
    <ServiceProvider Name="Portal.Web" AssertionConsumerServiceUrl="http://localhost:49462/SingleSignOn/ConsumeAssertion" />
    <PartnerIdentityProvider Name="MTMIdentity" SignAuthnRequest="false" WantResponseSigned="false" WantAssertionSigned="false" WantAssertionEncrypted="false" SingleSignOnServiceUrl="https://identity.********.com/SingleSignOn/" />
</SAMLConfiguration>

为什么变换测试仪不应用变换?

编辑:

我应该补充一点,我使用 SlowCheetah addin / nuget 包在本地和我们的暂存环境中处理转换。

考虑文档(http://support.appharbor.com/kb/getting-started/managing-environments)状态

具有相应 .release.config 文件的所有 .config 文件都支持配置文件转换。

我假设 AppHarbor 可以在没有 SlowCheetah 的情况下做到这一点。但同样,WebConfigTransformTester 工具不应用此转换。

所以问题仍然是,我该如何应用这种转换?我可以在 AppHarbor 中使用 SlowCheetah 吗?

编辑:

经过进一步调查,AppHarbor 似乎也没有将转换应用于 Web.Config。

我的配置:

在此处输入图像描述

Web.Config 中的 AppSettings

<appSettings>
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="aspnet:UseHostHeaderForRequestUrl" value="true" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    <add key="Environment" value="Development" />
</appSettings>

注意环境设置为“开发”

发布改造:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <appSettings>
        <add key="Environment" value="Release" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
    </appSettings>
    <system.web>
        <compilation xdt:Transform="RemoveAttributes(debug)" />
        <customErrors defaultRedirect="GenericError.htm" mode="Off" xdt:Transform="Replace">
            <error statusCode="500" redirect="InternalError.htm"/>
        </customErrors>
    </system.web>
</configuration>

注意环境被替换为“发布”

AppHarbor 环境:

在此处输入图像描述

部署到 AppHarbor 后,我下载了构建并检查了 Web.Config,它仍然在“开发”处具有环境设置。

编辑:

我向我的一个控制器添加了一个动作,它读取环境 AppSetting 并输出到视图,令我惊讶的是它是“发布”!!!

那么给了什么?“下载构建”内容没有适当的转换,但是当请求发生时呢?AppHarbor 何时应用转换?它是在运行时而不是在构建期间吗?

编辑:

从 AppHarbor 人员那里得知,转换发生在实际发布时,因此即使构建有一个“已发布网站”文件夹,它仍然不是发布操作的最终输出。

谢谢,乔

4

2 回答 2

2

我们刚刚针对此问题推出了解决方案(使用您指出的最新转换程序集)并相应地更新了http://webconfigtransformationtester.apphb.com/。现在应该按预期应用您的转换。

感谢您对此问题的彻底调查。

于 2013-04-29T23:59:40.423 回答
0

来看看,我原来的问题的答案是没有发生转换的方式,是因为配置文件根节点中的 xmlns 属性。

不幸的是,http: //webconfigtransformationtester.apphb.com/ 没有给你任何关于为什么没有发生转换的信息,但是如果你查看代码,你可以看到有一个可用的记录器,但是它被设置为空。

我最终提取了代码并添加了一个记录器,发现一个警告“源文档中没有元素匹配'/SAMLConfiguration'”。进一步挖掘我发现了这篇文章为什么这个 web.config 转换说它找不到 applicationSettings 元素?在 Sayed 的回答中,他指出旧的 MSBuild 转换任务不尊重 xmlns 属性。

从配置文件和转换文件中删除 xmlns 属性应该可以解决问题。

但是,在我的情况下, xmlns 属性是必需的,并且无法删除。

因此,在 AppHarbor 更新他们的转换程序集以使用 MSBuild v11.0 程序集之前,我几乎被困住了。

于 2013-04-25T15:29:21.907 回答