可以使用哪些体系结构来打破单一的ASP.NET网站?

时间:2016-02-03 10:36:47

标签: c# asp.net-mvc ssl architecture url-routing

我想将一个单一的ASP.NET MVC网站划分为多个可以独立开发的网站,但保留一个带有相关SSL证书的公共URL - 它是单个主机证书,而不是通配符。 Possible architecture

公共网站的匿名用户的主要URL将保持不变,并且将成为标准的ASP.NET MVC网站,尽管用于此的技术将随着时间的推移而升级。

至于其他服务,可能有很多这些服务,它们可能在云端,Raspberry Pi或其他地方运行。许多响应流将以text / html的形式返回,但也会从某些API返回JSON。

为了安全起见,我计划将IdentityServer用作安全令牌服务(STS)(当它安定下来时可能是版本4),因此需要考虑因素 - 尤其是身份验证cookie处理。

我甚至不知道该怎么称呼我称这个前端'经销商',但我认为它将是轻量级的。我已经看到了一个节点服务器的快速演示,该节点服务器被用在这个角色的简单版本中,但是我对节点知之甚少,不知道这个策略的局限性。

我更喜欢C#ASP.NET MVC解决方案,因为我熟悉这项技术。

1 个答案:

答案 0 :(得分:0)

您的前端应用可能是一个简单的反向代理。

我已经编写了一篇关于使用Azure Web Apps创建免费反向代理的blog post。实际上,您可以免费执行此操作,至少在您测试一切按预期工作时是这样。

您可以使用IIS URL rewritingApplication Request Routing

您还希望在出路时重写内容,以便将对http://somehost.azurewebsites.net的任何引用重写为http://www.example.com/app1等。

以下是web.config示例:

<?xml version="1.0" encoding="utf-8"?>  
<configuration>  
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Proxy" stopProcessing="true">
                    <match url="example.com/(app1)/(.*)" />
                    <action type="Rewrite" url="http://somehost.azurewebsites.net/{R:2}" />
                    <serverVariables>
                        <set name="HTTP_X_UNPROXIED_URL" value="{R:0}" /> 
                        <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" /> 
                        <set name="HTTP_X_ORIGINAL_HOST" value="{HTTP_HOST}/{R:1}" />
                        <set name="HTTP_ACCEPT_ENCODING" value="" />
                    </serverVariables>
                </rule>
            </rules>
            <outboundRules>
                <rule name="ChangeReferencesToOriginalUrl" patternSyntax="ExactMatch" preCondition="CheckContentType">
                       <match filterByTags="None" pattern="http://example.com/app1" />
                       <action type="Rewrite" value="http://{HTTP_X_ORIGINAL_HOST}" />
                  </rule>
                <preConditions>
                    <preCondition name="CheckContentType">
                        <add input="{RESPONSE_CONTENT_TYPE}" pattern="^(text/html|text/plain|text/xml|application/rss\+xml)" />
                    </preCondition>
                </preConditions>
            </outboundRules>
        </rewrite>
    </system.webServer>
</configuration> 

请注意,通过规则http://www.example.com/app1/path/and/query?qs=1处理example.com/(app1)/(.*)意味着会发生这种情况:

{R:0}包含http://www.example.com/app1/path/and/query?qs=1

{R:1}包含app1

{R:2}包含path/and/query?qs=1