我有一个包含一些 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 人员那里得知,转换发生在实际发布时,因此即使构建有一个“已发布网站”文件夹,它仍然不是发布操作的最终输出。
谢谢,乔